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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top