2008-11-07 8 views
44

В моих view.py я создаю список двух кортежей, где второй элемент в кортеже - это еще один список, например:Django - Как сделать набор распаковки в цикле шаблона 'for'

[ 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:

Caught исключение во время рендеринга: почтовый аргумент # 2 должен поддерживать итерация

Конечно, есть некоторые HTML разметки в шаблоне, а не печатать заявления. Распаковка тюков не поддерживается на языке шаблонов Django? Или я об этом ошибаюсь? Все, что я пытаюсь сделать, это показать простую иерархию объектов - существует несколько типов продуктов, каждый из которых имеет несколько продуктов (в models.py, Product имеет внешний ключ к Product_type, простое отношение «один ко многим»).

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

+2

Вы говорите о кортежах, но ваш вопрос содержит только списки. Это разные вещи в python. – 2008-11-07 02:48:23

+0

У вас на самом деле нет двухкортежей. Посмотрите внимательно на свой список, у вас есть 4 элемента списка. Как отметил Jonny Buchanan, что вам нужно сделать это: [[Product_Type_1, [product_1, product_2]], [Product_Type_2, [product_3, product_4]]] , чтобы получить версию списка двух кортежей. – MontyThreeCard 2017-03-17 14:03:09

ответ

53

было бы лучше, если вы строите ваши данные как {обратите внимание, что может быть обменен «(» и «)» для «[» и «]» 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, второй в списке продуктов ...

2

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

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

Это было некоторое время, так что я не могу точно вспомнить, что синтаксис, дайте мне знать, если это работает. Проверьте documentation.

+0

+1: не перерабатывать в представлении – 2008-11-07 03:10:00

+0

Крис Лолор не объяснил, как он закончил структуру данных, которая у него есть (которая на самом деле не является списком двух кортежей), но этот предлагаемый подход привел бы к N + 1 запросов для отображения списка продуктов. – 2008-11-07 20:14:24

+0

Здесь будут драконы. Используя это предложение, вы делаете отдельную поездку в базу данных для каждого product_type. Я подозреваю, что минимизация загрузки базы данных, вероятно, является мотивацией использования кортежей в первую очередь. – btubbs 2009-12-03 01:05:55

5

Вы должны использоваться таким образом:

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

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

57

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

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

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

то можно распаковать этот список в файл шаблона следующим образом. В моем случае у меня был список кортежей, содержащий URL, заголовок и резюме документа.

{\% for item in mylst \%}  
    {{ item.0 }} {{ item.1}} {{ item.2 }}  
{\% endfor \%} 
1

Если у вас есть фиксированный номер в ваших кортежах, вы можете просто использовать индексирование.Мне нужно смешивать словарь и значения были кортежами, так что я сделал это:

По мнению:

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> 

 Смежные вопросы

  • Нет связанных вопросов^_^