繁体   English   中英

zip(list1, list2) 在 Jinja2 中?

[英]zip(list1, list2) in Jinja2?

我正在 Jinja2 中进行代码生成,我经常想一起遍历两个列表(即变量名称和类型),有没有一种简单的方法可以做到这一点,还是只需要传递一个预压缩的列表? 我无法在文档或谷歌搜索中找到这样的功能。

如果您认为合适,请修改 jinja2.Environment全局命名空间本身。

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

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

由于您没有提到您是否使用 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 %}

我不认为模板语言允许在 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))]

对于 Flask,您可以在render_template()传递 zip

  return render_template("home.html", zip=zip)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM