Django问题:上下文变量mylist无法重复用于多个for循环
问题解答
这是完全正常的现象,根源在于zip()函数返回的是迭代器(iterator),而非普通列表。
迭代器的核心特性是只能被遍历一次:第一次在模板里循环mylist时,迭代器会逐个返回元素,直到所有元素被取完,此时迭代器内部指针已指向末尾,第二次循环时就没有元素可返回,自然为空。
而普通列表属于可迭代对象(iterable),每次循环都会重新生成一个新的迭代器来遍历元素,因此可以反复循环多次。
解决办法
- 最直接的方式:在视图层把zip的结果转换成列表:
转换后的列表可在模板中任意次数循环,和你使用普通列表的表现一致。mylist = list(zip(set1, set2, set3)) - 如果数据量极大,不想一次性占用内存生成完整列表,可在模板中先把迭代器转成列表再复用(需自定义一个
list过滤器):
先在template_tags目录下创建自定义过滤器文件(比如custom_tags.py):
然后在模板中使用:from django import template register = template.Library() @register.filter def listify(value): return list(value){% load custom_tags %} {% with mylist_as_list=mylist|listify %} {% for val1, val2, val3 in mylist_as_list %} <!-- 第一次循环内容 --> {% endfor %} {% for val1, val2, val3 in mylist_as_list %} <!-- 第二次循环内容 --> {% endfor %} {% endwith %}
内容的提问来源于stack exchange,提问作者christian ortiz
相关产品推荐
相关产品推荐

