web-dev-qa-db-ja.com

Django-テンプレートの「for」ループでタプルをアンパックする方法

私の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の初心者なので、どんな入力でも歓迎します。

55
Chris Lawlor

{'('と ')'を '['と ']'にそれぞれ交換できることに注意してください。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番目は製品のリスト...

63
Jake

別の方法は次のとおりです。

タプルのリストがある場合は言う:

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

次に、次の方法でテンプレートファイルにこのリストを展開できます。私の場合、ドキュメントのURL、タイトル、および要約を含むタプルのリストがありました。

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

次の方法で使用する必要があります。

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

辞書データの変数項目を忘れないでください

5
Yasel

タプルに固定数がある場合は、単にインデックスを使用できます。辞書を混在させる必要があり、値はタプルだったので、これを行いました:

ビューで:

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>
3
famousfilm

テンプレートに製品タイプのリストを送信し、次のようなことを行うだけです。

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

少し前のことなので、構文が何であるかを正確に思い出せません。それが機能するかどうかを教えてください。 ドキュメント を確認してください。

2
Harley Holcombe