Django - как сделать кортеж распаковки в шаблоне' для ' цикла


В моем views.py, я строю список из двух кортежей, где второй элемент в кортеже-это другой список, например:

[ 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 в шаблоне, а не инструкции печати. Распаковка кортежа не поддерживается в языке шаблонов Django? Или я иду по этому неправильному пути? Все, что я пытаюсь сделать, это отобразить простую иерархию объектов - есть несколько типов продуктов, каждый из которых имеет несколько продуктов (в models.py, продукт имеет внешний ключ к Product_type, простое отношение один ко многим).

очевидно, что я совершенно новичок в Django,поэтому любой вклад будет оценен.

5 51

5 ответов:

было бы лучше, если бы вы построили свои данные, такие как {обратите внимание, что " ("и") "можно обменять на" ["и"] " репрессивно, один для кортежей, один для списков}

[ (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 основан на элементе, возвращенном итератором списка. на каждой итерации возвращался только один элемент. первый раз вокруг цикла, Product_Type_1, второй ваш список продуктов...

другой способ заключается в следующем.

Если у вас есть список кортежей сказать:

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 %}

Не забудьте переменные элементы в словаре данных

просто отправьте шаблону список типов продуктов и сделайте что-то вроде:

{% for product_type in product_type_list %}
    {{ product_type }}
    {% for product in product_type.products.all %}
        {{ 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>