自己接触django时间不长,刚遇到一点小问题,就是在django模板中如何并行迭代多个列表。
一开始我想到或许可以传入多个列表,然后在模板中使用forloop.counter变量的值去访问另一个列表的元素。
比如当我迭代list1和list2的时候,使用类似下面的代码:
{% for item in list1 %}
access list2 item via {{ list2.forloop.counter}}
{% endfor %}
forloop.counter是一个计数器,保存了当前的迭代计数器。然而,测试之后,发现这个方法是不可行的。
随后,我又测试了另一种方法,在模板中zip打包 list1和list2,然后通过序列解包来并行迭代。模板代码类似:
{% for item1,item2 in zip(list1, list2) %}
{{item1}} {{item2}}
{% endfor %}
不过, 这样也是不可行的。模板系统无法完成上面的工作。
那么,到底应该如何并行迭代呢?
真正可行的方法,是先在view中zip打包多个列表,然后把得到的结果作为一个模板变量传入。
像lst_objects = zip(list1, list2)这样的语句应该位于视图函数,而不是模板中。
在模板内解包lst_objects,可以通过序列解包,还可以使用索引直接访问各个元素。
方法1:
{{ for item1,item2 in lst_objects}}
{{item1}} {{item2}}
{{endfor}}
方法2:
{{ for item in lst_objects }}
{{item.0}} {{item.1}}
{{ endfor }}
参考链接:http://stackoverflow.com/questions/2415865/iterating-through-two-lists-in-django-templates