![](/img/trans.png)
[英]With django templates, how to remove the last item newline in a loop
[英]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.