Jinja2中的zip(list1, list2)?

58 投票
4 回答
30337 浏览
提问于 2025-04-16 13:05

我在用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 %}
65

如果你觉得有必要,可以修改 jinja2.Environment 的 全局命名空间

import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

这样做可能有助于把视图(模板)逻辑和应用程序逻辑分开,但也可以反过来。#关注点分离

撰写回答