通过一个循环,很容易编写{% 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 %}
是否有更好的方法跳过嵌套循环的最后一次迭代?
答案 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 %}