Подтвердить что ты не робот

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, поэтому любой ввод будет оценен.

4b9b3361

Ответ 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>