Django - Как выполнить распаковку кортежа в цикле шаблона 'for'
В моем view.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 имеет внешний ключ к Product_type, простое отношение "один ко многим" ).
Очевидно, что я совершенно новичок в Django, поэтому любой ввод будет оценен.
Ответы
Ответ 1
было бы лучше, если бы вы построили свои данные, например: {note '(' and ')' можно обменять на '[' и ']' соответственно, один для кортежей, один для списков}
[ (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, второй ваш список продуктов...
Ответ 2
Другой способ заключается в следующем.
Если у вас есть список кортежей, скажите
mylst = [(a, b, c), (x, y, z), (l, m, n)],
то можно распаковать этот список в файл шаблона следующим образом.
В моем случае у меня был список кортежей, содержащий URL, заголовок и краткое описание документа.
{\% for item in mylst \%}
{{ item.0 }} {{ item.1}} {{ item.2 }}
{\% endfor \%}
Ответ 3
Вы должны использовать этот способ:
{% for product_type, products in product_list.items %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
Не забывайте переменные в данных словаря
Ответ 4
Просто отправьте шаблону список типов продуктов и сделайте что-то вроде:
{% for product_type in product_type_list %}
{{ product_type }}
{% for product in product_type.products.all %}
{{ product }}
{% endfor %}
{% endfor %}
Было немного, поэтому я не могу точно запомнить, что такое синтаксис, сообщите мне, если это работает. Проверьте документацию.
Ответ 5
Если у вас есть фиксированный номер в ваших кортежах, вы можете просто использовать индексацию. Мне нужно было смешать словарь, и значения были кортежами, поэтому я сделал это:
В представлении:
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>