簡體   English   中英

如何刪除jinja嵌套循環中的最后一項?

[英]How to remove the last item in jinja nested loop?

使用單個循環,很容易編寫{% if not loop.last %}JOIN{% endif %}從循環的最后一次迭代中刪除JOIN

使用嵌套循環,我們可以訪問外部循環,允許我們檢查我們是否處於兩個循環的最終迭代中。

不過,我有一個 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,該使用特殊的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 %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM