在我的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标记,而不是print语句。 Django模板语言不支持元组解包吗?或者我是以错误的方式来做这件事的?我要做的就是显示一个简单的对象层次结构 - 有几种产品类型,每种都有几种产品(在models.py中,Product有Product_type的外键,简单的一对多关系)。
显然,我对Django很新,所以任何意见都会受到赞赏。
答案 0 :(得分:73)
另一种方式如下。
如果有一个元组列表说:
mylst = [(a, b, c), (x, y, z), (l, m, n)]
然后可以通过以下方式在模板文件中解压缩此列表。 在我的例子中,我有一个元组列表,其中包含文档的URL,标题和摘要。
{% for item in mylst %}
{{ item.0 }} {{ item.1}} {{ item.2 }}
{% endfor %}
答案 1 :(得分:63)
最好是构建你的数据,例如{注意'('和')'可以分别交换'['和']',一个用于元组,一个用于列表}
[ (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 :(得分:5)
你必须这样使用:
{% for product_type, products in product_list.items %}
print product_type
{% for product in products %}
print product
{% endfor %}
{% endfor %}
不要忘记字典数据中的变量项
答案 3 :(得分:3)
如果元组中有固定数字,则可以使用索引编制。我需要混合字典,值是元组,所以我这样做了:
在视图中:
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>
答案 4 :(得分:2)
只需向模板发送产品类型列表,然后执行以下操作:
{% for product_type in product_type_list %}
{{ product_type }}
{% for product in product_type.products.all %}
{{ product }}
{% endfor %}
{% endfor %}
已经有一段时间了,所以我不记得究竟是什么语法,让我知道这是否有效。查看documentation。