Pergunta

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 antiga Python, 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:

Caught uma exceção durante a prestação de: argumento zip # 2 deve suportar iteração

É claro, há alguma 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.

Foi útil?

Solução

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 %}

A forma tuplas / 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 ...

Outras dicas

Outra forma é a seguinte.

Se uma pessoa tem uma lista de tuplas dizer:

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

então pode 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 %}

Você deve usadas desta maneira:

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

Não se esqueça os itens variáveis ??nos dados do dicionário

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 o seguinte:

Do ponto de vista:

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>

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top