Как вывести список с разделителями-запятыми в jinja python template?

Если у меня есть список users say ["Sam", "Bob", "Joe"], я хочу сделать что-то, где я могу вывести файл my jinja:

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

Я хочу создать выходной шаблон:

Sam, Bob, Joe

Я попробовал вышеуказанный код, чтобы проверить, была ли она на последней итерации цикла, а если нет, то не вставляйте запятую, но она не работает. Как это сделать?

Ответ 1

Вы хотите, чтобы ваша проверка if была:

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

Обратите внимание, что вы также можете сократить код, используя Если выражение:

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

Ответ 3

И используя joiner из http://jinja.pocoo.org/docs/dev/templates/#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 %}

Ответ 4

Следующий код работал с использованием фильтра присоединения jinja2, предложил Ули Мартенс в оболочке python3.5:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'