我在 Jinja2 中进行代码生成,我经常想一起遍历两个列表(即变量名称和类型),有没有一种简单的方法可以做到这一点,或者我只需要传递一个预压缩列表?我无法在文档或谷歌搜索中找到这样的功能。
问问题
20551 次
4 回答
23
因为你没有提到你是否使用 Flask,所以我想我会添加我的发现。
由使用 Flask 使用的 Jinja2 环境中render_template()
的函数创建“zip”过滤器使用。zip()
app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip
要在模板中使用它,请执行以下操作:
{% for value1, value2 in iterable1|zip(iterable2) %}
{{ value1 }} is paired with {{ value2 }}
{% endfor %}
请记住,字符串是可迭代的 Jinja2,所以如果你尝试压缩到字符串,你会得到一些疯狂的东西。要确保您要压缩的内容是可迭代的,而不是字符串,请执行以下操作:
{% if iterable1 is iterable and iterable1 is not string
and iterable2 is iterable and iterable2 is not string %}
{% for value1, value2 in iterable1|zip(iterable2) %}
{{ value1 }} is paired with {{ value2 }}
{% endfor %}
{% else %}
{{ iterable1 }} is paired with {{ iterable2 }}
{% endif %}
于 2017-09-29T19:04:28.640 回答
5
对于 Flask,您可以在render_template()
return render_template("home.html", zip=zip)
于 2020-10-20T19:46:04.370 回答
3
我不认为模板语言允许在 for 循环中对两个容器进行 zip 压缩。这是django的一个类似问题,而 jinja 模板非常接近 django 的。
您将预先构建压缩容器并传递给您的模板。
>> for i,j in zip(range(10),range(20,30)):
... print i,j
...
相当于
>>> [(i,j) for i,j in zip(range(10),range(20,30))]
于 2011-03-06T02:42:03.007 回答