65

在我的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有一个Product_type的外键,一个简单的一对多关系)。

显然,我对 Django 很陌生,所以任何输入都将不胜感激。

4

5 回答 5

89

另一种方法如下。

如果有一个元组列表,请说:

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

然后可以通过以下方式在模板文件中解压缩此列表。在我的例子中,我有一个包含 URL、标题和文档摘要的元组列表。

{% for item in mylst %}    
     {{ item.0 }} {{ item.1}} {{ item.2 }}    
{% endfor %}
于 2011-01-21T08:23:38.587 回答
71

最好是构建数据,例如{注意 '(' 和 ')' 可以分别交换为 '[' 和 ']',一个用于元组,一个用于列表}

[ (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,第二次你的产品列表......

于 2008-11-07T03:11:51.783 回答
8

你必须这样使用:

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

不要忘记字典数据中的变量项

于 2009-07-22T21:41:13.840 回答
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>
于 2016-02-19T18:53:19.960 回答
2

只需向模板发送产品类型列表并执行以下操作:

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

已经有一段时间了,所以我不记得确切的语法是什么,让我知道它是否有效。检查文档

于 2008-11-07T02:47:41.320 回答