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

时间:2018-10-25 03:19:07

标签: python jinja2

通过一个循环,很容易编写{% if not loop.last %}JOIN{% endif %}从循环的最后一次迭代中删除JOIN

有了嵌套循环,我们可以access the outer loop,让我们检查是否在两个循环的最终迭代中。

仍然,我有一个三层嵌套,对此解决方案非常冗长:

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

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

1 个答案:

答案 0 :(得分:1)

如果您愿意编写一些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 %}