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 ответов
было бы лучше, если бы вы построили свои данные, такие как {обратите внимание, что " ("и") "можно обменять на" ["и"] " repectively, один для кортежей, один для списков}
[ (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 %}
способ распаковки кортежей / списков для циклов основан на элементе, возвращаемом итератором списка. каждая итерация возвращала только один элемент. первый раз вокруг цикла, 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 %}
Не забудьте переменные элементы в словаре data
просто отправьте шаблону список типов продуктов и сделайте что-то вроде:
{% 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>