有没有办法在django中同时循环两个列表?

时间:2013-02-12 20:25:24

标签: python django django-templates django-views

我有两个相同长度的列表对象,我希望渲染的补充数据有一种方法可以同时渲染两者。

{% for i,j in table, total %} 
 {{ i }} 
 {{ j }}
{% endfor %} 

或类似的东西?

6 个答案:

答案 0 :(得分:30)

如果两个列表的长度相同,则可以在视图中返回zipped_data = zip(table, total)作为模板上下文,从而生成一个包含2值元组的列表。

示例:

>>> lst1 = ['a', 'b', 'c']
>>> lst2 = [1, 2, 3]
>>> zip(lst1, lst2)
[('a', 1), ('b', 2), ('c', 3)]

在模板中,您可以写:

{% for i, j in zipped_data %}
    {{ i }}, {{ j }}
{% endfor %}

另外,请查看Django关于for模板标记here的文档。它提到了使用它的所有可能性,包括很好的例子。

答案 1 :(得分:5)

使用python的zip功能并将2个列表压缩在一起。

在您看来:

zip(table, list)

在模板中,您可以像简单列表一样迭代它,并使用.0和.1属性分别从表和列表中访问数据。

答案 2 :(得分:3)

如果只是您正在查看的变量ij,那么这应该有用 -

return render_to_response('results.html',
    {'data': zip(table, list)})

{% for i, j in data %}
    <tr>
        <td> {{ i }}: </td> <td> {{ j }} </td>
    </tr>
{% endfor %}

(感谢所有回答此问题的人)

答案 3 :(得分:2)

对于此问题的最近访问者,forloop.parentloop可以模仿两个列表的压缩:

{% for a in list_a %}{% for b in list_b %}
    {% if forloop.counter == forloop.parentloop.counter %}
        {{a}} {{b}}
    {% endif %}
{% endfor %}{% endfor %}

答案 4 :(得分:1)

不是使用字典(不保证任何类型的排序),而是在两个列表上使用python zip函数并将其传递给模板。

答案 5 :(得分:1)

您必须在视图中执行此操作 - 使用内置zip函数创建元组列表,然后在模板中迭代它。

模板逻辑非常简单,任何甚至稍微复杂的都应该在视图中完成。