Django-テンプレートの「for」ループでタプルをアンパックする方法
-
06-07-2019 - |
質問
views.pyで、2タプルのリストを作成しています。タプルの2番目の項目は、次のような別のリストです。
[ Product_Type_1, [ product_1, product_2 ],
Product_Type_2, [ product_3, product_4 ]]
単純な古いPythonでは、次のようにリストを反復できます。
for product_type, products in list:
print product_type
for product in products:
print product
Djangoテンプレートで同じことを実行できないようです:
{% for product_type, products in product_list %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
Djangoからこのエラーが表示されます:
レンダリング中に例外をキャッチしました:zip引数#2は反復をサポートする必要があります
もちろん、テンプレートにはHTMLステートメントがあり、printステートメントではありません。タプルのアンパックはDjangoテンプレート言語ではサポートされていませんか?それとも私はこれについて間違った方法で行っていますか?私がやろうとしているのは、オブジェクトの単純な階層を表示することだけです-複数の製品タイプがあり、それぞれに複数の製品があります(models.pyでは、ProductにはProduct_typeへの外部キー、単純な1対多の関係があります)。
明らかに、私はDjangoを初めて使用するので、どんな入力でも歓迎します。
解決
{'('と ')'を '['と ']'にそれぞれ交換できることに注意してください。1つはタプル用、もう1つはリスト用です}
[ (Product_Type_1, ( product_1, product_2 )),
(Product_Type_2, ( product_3, product_4 )) ]
そしてテンプレートにこれをさせる:
{% for product_type, products in product_type_list %}
{{ product_type }}
{% for product in products %}
{{ product }}
{% endfor %}
{% endfor %}
タプル/リストがforループで展開される方法は、リスト反復子によって返される項目に基づいています。 各反復で1つのアイテムのみが返されました。ループの最初はProduct_Type_1、2番目は製品のリスト...
他のヒント
別の方法は次のとおりです。
次のようなタプルのリストがある場合:
mylst = [(a, b, c), (x, y, z), (l, m, n)]
その後、次の方法でテンプレートファイルにこのリストを展開できます。 私の場合、ドキュメントのURL、タイトル、および要約を含むタプルのリストがありました。
{% for item in mylst %}
{{ item.0 }} {{ item.1}} {{ item.2 }}
{% endfor %}
この方法で使用する必要があります:
{% for product_type, products in product_list.items %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
辞書データの変数項目を忘れないでください
タプルに固定数がある場合は、インデックスを使用できます。辞書を混在させる必要があり、値はタプルでしたので、これを行いました:
ビュー内:
my_dict = {'parrot': ('dead', 'stone'), 'lumberjack': ('sleep_all_night', 'work_all_day')}
テンプレート内:
<select>
{% for key, tuple in my_dict.items %}
<option value="{{ key }}" important-attr="{{ tuple.0 }}">{{ tuple.1 }}</option>
{% endfor %}
</select>
テンプレートに製品タイプのリストを送信し、次のように実行します。
{% for product_type in product_type_list %}
{{ product_type }}
{% for product in product_type.products.all %}
{{ product }}
{% endfor %}
{% endfor %}
少し前から、構文が何であるかを正確に思い出せません。それが機能するかどうかを教えてください。 ドキュメントを確認してください。