Jinja2中的zip(list1, list2)?
我在用Jinja2生成代码,常常需要同时遍历两个列表(比如变量名和类型),有没有简单的方法可以做到这一点?还是说我必须先把这两个列表合并成一个再传进去?我在文档里找不到这样的功能,也没在网上找到相关信息。
4 个回答
9
在Flask中,你可以在render_template()
这个函数里传递一个zip对象。
return render_template("home.html", zip=zip)
31
因为你没有提到你是否在使用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中,字符串是可以被迭代的,所以如果你尝试把两个字符串用zip在一起,你可能会得到一些奇怪的结果。为了确保你想要合并的内容是可以迭代的,而不是字符串,可以这样做:
{% 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 %}