【问题标题】:zip(list1, list2) in Jinja2?Jinja2 中的 zip(list1, list2)?
【发布时间】:2023-03-23 12:42:02
【问题描述】:

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

【问题讨论】:

    标签: python code-generation jinja2


    【解决方案1】:

    如果您认为合适,请自行修改 jinja2.Environment global namespace

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

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

    【讨论】:

    • 对于 Flask 应用程序:app.jinja_env.globals.update(zip=zip)
    • 对于 Pyramid 应用程序,请使用 env = config.get_jinja2_environment()。然后继续如上。有关如何在应用配置中正确使用该方法的详细信息,请参阅docs.pylonsproject.org/projects/pyramid_jinja2/en/latest/…
    【解决方案2】:

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

    【讨论】:

    • 向烧瓶应用程序添加配置非常有用的答案
    • 谢谢!您的第二个 zip 示例在 Jinja 中非常有效。
    【解决方案3】:

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

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

    【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 好吧,我也很怀疑。 FWIW,我通过将我的列表合并到一个新类的单个列表中来解决这个问题,无论如何这可能更优雅。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2021-09-10
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多