【发布时间】:2023-03-23 12:42:02
【问题描述】:
我在 Jinja2 中进行代码生成,并且我经常想一起遍历两个列表(即变量名称和类型),有没有一种简单的方法可以做到这一点,还是我只需要传递一个预压缩列表?我在docs 或谷歌搜索中找不到这样的功能。
【问题讨论】:
标签: python code-generation jinja2
我在 Jinja2 中进行代码生成,并且我经常想一起遍历两个列表(即变量名称和类型),有没有一种简单的方法可以做到这一点,还是我只需要传递一个预压缩列表?我在docs 或谷歌搜索中找不到这样的功能。
【问题讨论】:
标签: python code-generation jinja2
如果您认为合适,请自行修改 jinja2.Environment global namespace。
import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)
这可能有助于将视图(模板)逻辑与应用程序逻辑分开,但也可以反过来。 #separationofconcerns
【讨论】:
app.jinja_env.globals.update(zip=zip)
env = config.get_jinja2_environment()。然后继续如上。有关如何在应用配置中正确使用该方法的详细信息,请参阅docs.pylonsproject.org/projects/pyramid_jinja2/en/latest/…。
由于您没有提及您是否使用 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 %}
【讨论】:
对于 Flask,您可以在 render_template() 中传递 zip
return render_template("home.html", zip=zip)
【讨论】:
我认为模板语言不允许在 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))]
【讨论】: