我正在用Jinja2做代码生成,我经常想一起迭代两个列表(即变量名称和类型),有没有简单的方法可以做到这一点,或者我只需要传递一个预压缩的列表?我在docs或谷歌搜索中找不到这样的功能。
发布于 2011-03-08 02:51:56
如果您认为合适,请修改jinsa2.Environment global namespace本身。
import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)
这可能有助于将视图(模板)逻辑从应用程序逻辑中分离出来,但也可以实现相反的效果。#separationofconcerns
发布于 2017-09-30 03:04:29
既然你没有提到你是否在使用Flask,我想我应该加上我的发现。
要由render_template()
使用,请在Flask使用的Jinja2环境中使用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 %}
发布于 2011-03-06 10:42:03
我不认为模板语言允许在for循环上压缩两个容器。这是一个类似的问题,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))]
https://stackoverflow.com/questions/5208252
复制相似问题