20

我有两个长度相同的列表对象以及我想要渲染的互补数据是否有办法同时渲染两者,即。

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

或类似的东西?

4

6 回答 6

44

如果两个列表的长度相同,您可以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模板标签的文档。它提到了你使用它的所有可能性,包括很好的例子。

于 2013-02-12T20:44:51.370 回答
7

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

{% for a in list_a %}{% for b in list_b %}
    {% if forloop.counter == forloop.parentloop.counter %}
        {{a}} {{b}}
    {% endif %}
{% endfor %}{% endfor %}
于 2017-06-13T17:04:48.370 回答
5

如果它只是变量i并且j您正在查看,那么这应该有效 -

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

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

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

于 2013-02-12T20:41:42.610 回答
5

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

在您看来:

zip(table, list)

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

于 2013-02-12T20:44:15.680 回答
1

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

于 2013-02-12T20:43:23.193 回答
1

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

模板逻辑很简单,任何稍微复杂的事情都应该在视图中完成。

于 2013-02-12T20:45:12.930 回答