gpt4 book ai didi

python - 如何删除 jinja 嵌套循环中的最后一项?

转载 作者:行者123 更新时间:2023-12-01 08:53:05 25 4
gpt4 key购买 nike

使用单个循环,可以轻松编写 {% if not loop.last %}JOIN{% endif %} 来从最后一次迭代中删除 JOIN循环。

通过嵌套循环,我们可以access the outer loop ,允许我们检查是否处于两个循环的最终迭代中。

不过,我有一个 3 级嵌套,对此解决方案相当冗长:

{% set loop1 = loop %}
...
{% set loop2 = loop %}
...
{% if not loop1.last and loop2.last and loop.last %}JOIN{% endif %}

是否有更好的方法来跳过嵌套循环的最后一次迭代?

最佳答案

如果您愿意编写一点 Python,您可以通过编写自定义过滤器(此代码必须在加载任何模板之前运行)或仅添加 all 来使其成为一个干净的衬里到您的全局 Jinja2 环境:

from jinja2 import Environment, PackageLoader, select_autoescape, last

env = Environment(
loader = PackageLoader('yourapplication', 'templates'),
autoescape = select_autoescape(['html', 'xml'])
)

def between(token, *args):
return token if all(x.last for x in args) else ''

env.globals['between'] = between
env.globals['all'] = all

现在你可以做:

{{ 'JOIN'|between(loop1, loop2, loop) }}
# or
{% if not all([loop1, loop2, loop]|map('last')) %}JOIN{% endif %}

否则,您可以实现 Jinja2 macro它使用特殊的 varargs 变量来访问作为 Jinja2 列表传递给宏的所有未命名参数。

{% macro between(token) -%}
{% if not varargs|map('last')|select|length == varargs|length -%}
{{ token }}
{%- endif %}
{%- endmacro %}

请注意,示例中使用 - 表示当 {%- 之前和 -%} 之前的空格将被删除宏观扩张。现在的用法:

{{ between(token = JOIN, loop1, loop2, loop) }}

您可以在文件中保留各种 Jinja2 实用程序宏,并将其包含在模板的顶部,如下所示:{% include 'util.jinja2' as 'util' %} 和用法变为:

{{ util.between(token = JOIN, loop1, loop2, loop) }}

制作宏集合并在模板中使用它的另一种方法是在模板中内联进行。这是一个用一个衬垫来实现这一目的的想法:

{% set loops = [loop1, loop2, loop] %}
{% if not loops|map('last')|select|length == loops|length %}JOIN{% endif %}

关于python - 如何删除 jinja 嵌套循环中的最后一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52980849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com