如果我有一个用户列表说[“Sam”,“Bob”,“Joe”],我想做一些事情,我可以在我的jinja模板文件中输出:

{% for user in userlist %}
    <a href="/profile/{{ user }}/">{{ user }}</a>
    {% if !loop.last %}
        , 
    {% endif %}
{% endfor %}   

我想让输出模板是:

Sam, Bob, Joe

我尝试了上面的代码来检查它是否在循环的最后一次迭代中,如果不是,那么就不要插入逗号,但它不起作用。我怎么做呢?


当前回答

并使用来自https://jinja.palletsprojects.com/templates/#joiner的joiner

{% set comma = joiner(",") %}
{% for user in userlist %}
    {{ comma() }}<a href="/profile/{{ user }}/">{{ user }}</a>
{% endfor %}  

它就是为了这个目的而制造的。通常是forloop的连接或检查。Last对于一个列表来说已经足够了,但是对于多组事情来说它是有用的。

一个关于为什么要使用它的更复杂的例子。

{% set pipe = joiner("|") %}
{% if categories %} {{ pipe() }}
    Categories: {{ categories|join(", ") }}
{% endif %}
{% if author %} {{ pipe() }}
    Author: {{ author() }}
{% endif %}
{% if can_edit %} {{ pipe() }}
    <a href="?action=edit">Edit</a>
{% endif %}

其他回答

你也可以像这样使用内置的连接过滤器:

{{ users|join(', ') }}

并使用来自https://jinja.palletsprojects.com/templates/#joiner的joiner

{% set comma = joiner(",") %}
{% for user in userlist %}
    {{ comma() }}<a href="/profile/{{ user }}/">{{ user }}</a>
{% endfor %}  

它就是为了这个目的而制造的。通常是forloop的连接或检查。Last对于一个列表来说已经足够了,但是对于多组事情来说它是有用的。

一个关于为什么要使用它的更复杂的例子。

{% set pipe = joiner("|") %}
{% if categories %} {{ pipe() }}
    Categories: {{ categories|join(", ") }}
{% endif %}
{% if author %} {{ pipe() }}
    Author: {{ author() }}
{% endif %}
{% if can_edit %} {{ pipe() }}
    <a href="?action=edit">Edit</a>
{% endif %}

你希望你的if检查是:

{% if not loop.last %}
    ,
{% endif %}

注意,你也可以使用If表达式来缩短代码:

{{ ", " if not loop.last else "" }}