Frage

In meinem views.py, Ich baue eine Liste von zwei Tupeln, wobei das zweite Element in dem Tupel ist eine weitere Liste, wie folgt aus:

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

In einfachen alten Python, ich habe die Liste wie diese Iteration könnte:

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

Ich kann nicht scheinen, um die gleiche Sache in meiner Django-Vorlage zu tun:

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

Ich bekomme diese Fehlermeldung von Django:

eine Ausnahme beim Rendern: zip Argument # 2 muss Iteration unterstützen

Natürlich gibt es einige HTML-Markup in der Vorlage, keine Aussagen drucken. Ist Tupel Auspacken in der Django Template-Sprache nicht unterstützt? Oder soll ich das über den falschen Weg? Alles, was ich eine einfache Hierarchie von Objekten zu tun versuche, ist angezeigt - es mehrere Produkttypen sind, die jeweils mit mehreren Produkten (in models.py, hat Produkt einen Fremdschlüssel zu PRODUCT_TYPE, eine einfache Eins-zu-viele-Beziehung)

Natürlich, ich bin ganz neu zu Django, so würde jeder Eingang geschätzt.

War es hilfreich?

Lösung

wäre es am besten, wenn Sie Ihre Daten konstruieren wie {beachten Sie den ‚(‘ und ‚)‘ kann ausgetauscht werden ‚[‘ und ‚]‘ repectively, ein für Tupel sein, ein für Listen}

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

und haben die Vorlage dies tun:

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

die Art und Weise Tupel / Listen in for-Schleifen ausgepackt werden, wird auf der Grundlage des Artikel von der Liste Iterator zurückgegeben. jede Iteration wurde nur ein Element zurückgegeben. das erste Mal, um die Schleife, Product_Type_1, die zweite Liste der Produkte ...

Andere Tipps

Eine andere Möglichkeit ist wie folgt.

Wenn man eine Liste von Tupeln hat sagen:

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

, dann kann man diese Liste in der Vorlagendatei in der folgenden Weise entpacken. In meinem Fall hatte ich eine Liste von Tupeln, die die URL enthalten, Titel und Zusammenfassung eines Dokuments.

{% for item in mylst %}    
     {{ item.0 }} {{ item.1}} {{ item.2 }}    
{% endfor %}

Sie müssen diese Art und Weise verwendet:

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

Sie die variablen Elemente in den Wörterbuchdaten nicht vergessen,

Wenn Sie eine feste Nummer in Ihrer Tupel haben, können Sie nur die Indizierung verwenden. Ich brauchte ein Wörterbuch zu mischen und die Werte waren Tupeln, also tat ich dies:

In der Ansicht:

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

In der Vorlage:

<select>
  {% for key, tuple in my_dict.items %}
    <option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option>
  {% endfor %}
</select>

Sie einfach die Vorlage, um eine Liste der Produkttypen senden und so etwas wie:

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

Es ist schon eine kleine Weile, so kann ich nicht mehr genau, was die Syntax ist, lassen Sie mich wissen, ob das funktioniert. Schauen Sie sich die Dokumentation rel="nofollow.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top