Django - 如何在模板'for'循环中进行元组解包

Chr*_*lor 56 python django templates tuples iterable-unpacking

在我的views.py中,我正在构建一个包含两元组的列表,其中元组中的第二项是另一个列表,如下所示:

[ Product_Type_1, [ product_1, product_2 ],
  Product_Type_2, [ product_3, product_4 ]]
Run Code Online (Sandbox Code Playgroud)

在普通的旧Python中,我可以像这样迭代列表:

for product_type, products in list:
    print product_type
    for product in products:
        print product
Run Code Online (Sandbox Code Playgroud)

我似乎无法在我的Django模板中做同样的事情:

{% for product_type, products in product_list %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我从Django得到这个错误:

渲染时捕获异常:zip参数#2必须支持迭代

当然,模板中有一些HTML标记,而不是print语句.Django模板语言不支持元组解包吗?或者我是以错误的方式来做这件事的?我要做的就是显示一个简单的对象层次结构 - 有几种产品类型,每种都有几种产品(在models.py中,Product有Product_type的外键,简单的一对多关系).

显然,我对Django很新,所以任何输入都会受到赞赏.

小智 75

另一种方式如下.

如果有一个元组列表说:

mylst = [(a, b, c), (x, y, z), (l, m, n)]
Run Code Online (Sandbox Code Playgroud)

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

{% for item in mylst %}    
     {{ item.0 }} {{ item.1}} {{ item.2 }}    
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

  • `.0` ......根本不直观. (4认同)
  • @iuliux 技巧是要记住模板语言使 `.` 意味着从变量访问到订阅、通过方法调用的任何内容,所有这些都具有相同的语法......仍然同意你的观点,tho:) (2认同)
  • 为什么正向斜线\那里? (2认同)

Jak*_*ake 64

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

[ (Product_Type_1, ( product_1, product_2 )),
   (Product_Type_2, ( product_3, product_4 )) ]
Run Code Online (Sandbox Code Playgroud)

并让模板执行此操作:

{% for product_type, products in product_type_list %}
    {{ product_type }}
    {% for product in products %}
        {{ product }}
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

在for循环中解包元组/列表的方式基于列表迭代器返回的项目.每次迭代只返回一个项目.第一次围绕循环,Product_Type_1,第二次你的产品列表......


小智 5

你必须用这种方式:

{% for product_type, products in product_list.items %}
    print product_type
    {% for product in products %}
        print product
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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