Django - Come eseguire il disimballaggio della tupla in un ciclo modello "for"
-
06-07-2019 - |
Domanda
Nel mio views.py, sto costruendo un elenco di due tuple, in cui il secondo elemento nella tupla è un altro elenco, come questo:
[ Product_Type_1, [ product_1, product_2 ],
Product_Type_2, [ product_3, product_4 ]]
Nel semplice vecchio Python, ho potuto iterare l'elenco in questo modo:
for product_type, products in list:
print product_type
for product in products:
print product
Non riesco a fare la stessa cosa nel mio modello Django:
{% for product_type, products in product_list %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
Ricevo questo errore da Django:
È stata rilevata un'eccezione durante il rendering: l'argomento zip n. 2 deve supportare l'iterazione
Ovviamente, c'è un markup HTML nel modello, non istruzioni di stampa. Il disimballaggio della tupla non è supportato nella lingua del modello Django? O sto andando in questo modo nel modo sbagliato? Tutto quello che sto cercando di fare è visualizzare una semplice gerarchia di oggetti: ci sono diversi tipi di prodotto, ognuno con diversi prodotti (in models.py, Product ha una chiave esterna per Product_type, una semplice relazione uno-a-molti).
Ovviamente, sono abbastanza nuovo in Django, quindi qualsiasi input sarebbe apprezzato.
Soluzione
sarebbe meglio se costruisci i tuoi dati come {notate che '(' e ')' può essere scambiato per '[' e ']' in modo ripetitivo, uno per tuple, uno per liste}
[ (Product_Type_1, ( product_1, product_2 )),
(Product_Type_2, ( product_3, product_4 )) ]
e fai in modo che il modello faccia questo:
{% for product_type, products in product_type_list %}
{{ product_type }}
{% for product in products %}
{{ product }}
{% endfor %}
{% endfor %}
il modo in cui le tuple / elenchi vengono decompressi per i loop si basa sull'elemento restituito dall'iteratore di elenchi. ogni iterazione è stata restituita solo una voce. la prima volta in giro, Product_Type_1, la seconda la tua lista di prodotti ...
Altri suggerimenti
Un altro modo è il seguente.
Se uno ha un elenco di tuple, dì:
mylst = [(a, b, c), (x, y, z), (l, m, n)]
quindi è possibile decomprimere questo elenco nel file modello nel modo seguente. Nel mio caso avevo un elenco di tuple che conteneva l'URL, il titolo e il riepilogo di un documento.
{% for item in mylst %}
{{ item.0 }} {{ item.1}} {{ item.2 }}
{% endfor %}
È necessario utilizzare in questo modo:
{% for product_type, products in product_list.items %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
Non dimenticare gli elementi variabili nei dati del dizionario
Se hai un numero fisso nelle tuple, puoi semplicemente usare l'indicizzazione. Avevo bisogno di mescolare un dizionario e i valori erano tuple, quindi ho fatto questo:
Nella vista:
my_dict = {'parrot': ('dead', 'stone'), 'lumberjack': ('sleep_all_night', 'work_all_day')}
Nel modello:
<select>
{% for key, tuple in my_dict.items %}
<option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option>
{% endfor %}
</select>
Basta inviare al modello un elenco di tipi di prodotti e fare qualcosa del tipo:
{% for product_type in product_type_list %}
{{ product_type }}
{% for product in product_type.products.all %}
{{ product }}
{% endfor %}
{% endfor %}
È passato un po 'di tempo, quindi non ricordo esattamente quale sia la sintassi, fammi sapere se funziona. Controlla la documentazione .