Django - Como fazer tupla desembalar em um modelo de laço 'for'

votos
46

Na minha views.py, eu estou construindo uma lista de tuplas duplas, onde o segundo item na tupla é uma outra lista, como este:

[ Product_Type_1, [ product_1, product_2 ],
  Product_Type_2, [ product_3, product_4 ]]

Na planície Python idade, eu poderia iteração da lista como esta:

for product_type, products in list:
    print product_type
    for product in products:
        print product

Eu não consigo fazer a mesma coisa no meu modelo Django:

{% for product_type, products in product_list %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}

Eu recebo este erro de Django:

Pego uma exceção durante o processamento: zip argumento nº 2 deve suportar iteração

Claro, há alguns marcação HTML no modelo, não imprimir declarações. É tupla não descompactação apoiada na língua modelo Django? Ou eu estou lidando com isso da maneira errada? Tudo o que eu estou tentando fazer é exibir uma hierarquia simples de objetos - existem vários tipos de produtos, cada uma com vários produtos (em models.py, O produto tem uma chave estrangeira para product_type, uma simples relação de um-para-muitos).

Obviamente, eu sou muito novo para Django, portanto, qualquer entrada seria apreciada.

Publicado 07/11/2008 em 03:40
fonte usuário
Em outras línguas...                            


5 respostas

votos
59

Outra forma é a seguinte.

Se alguém tem uma lista de tuplas dizer

mylst = [(a, b, c), (x, y, z), (l, m, n)],

então pode-se descompactar esta lista no arquivo de modelo da seguinte maneira. No meu caso eu tinha uma lista de tuplas que continham o URL, título e resumo de um documento.

{\% for item in mylst \%}    
     ` item`.`0 ` ` item`.`1` ` item`.`2 `    
{\% endfor \%}
Respondeu 21/01/2011 em 09:23
fonte usuário

votos
54

seria melhor se você construir os seus dados como {observe o '(' e ')' pode ser trocado por '[' e ']' repectively, sendo um para tuplas, um para listas}

[ (Product_Type_1, ( product_1, product_2 )),
   (Product_Type_2, ( product_3, product_4 )) ]

e ter o modelo de fazer isso:

{% for product_type, products in product_type_list %}
    ` product_type `
    {% for product in products %}
        ` product `
    {% endfor %}
{% endfor %}

as tuplas Ida / listas são descompactados em loops é baseado no artigo retornado pela lista iterator. cada iteração apenas um item foi devolvido. Pela primeira vez em torno do laço, Product_Type_1, o segundo sua lista de produtos ...

Respondeu 07/11/2008 em 04:11
fonte usuário

votos
5

Você deve usado desta forma:

{% for product_type, products in product_list.items %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}

Não se esqueça dos itens variáveis ​​no dicionário de dados

Respondeu 22/07/2009 em 22:41
fonte usuário

votos
2

Se você tem um número fixo em seus tuples, você pode simplesmente usar a indexação. Eu precisava para misturar um dicionário e os valores foram tuplas, então eu fiz isso:

Na visão:

my_dict = {'parrot': ('dead', 'stone'), 'lumberjack': ('sleep_all_night', 'work_all_day')}

No modelo:

<select>
  {% for key, tuple in my_dict.items %}
    <option value="` key `" important-attr="` tuple`.`0 `">` tuple`.`1 `</option>
  {% endfor %}
</select>
Respondeu 19/02/2016 em 18:53
fonte usuário

votos
2

Basta enviar o modelo de uma lista de tipos de produtos e fazer algo como:

{% for product_type in product_type_list %}
    ` product_type `
    {% for product in product_type.products.all %}
        ` product `
    {% endfor %}
{% endfor %}

Tem sido um pouco para que eu não me lembro exatamente o que a sintaxe é, deixe-me saber se isso funciona. Verifique a documentação .

Respondeu 07/11/2008 em 03:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more