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

179

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

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

Я хочу, чтобы шаблон вывода был:

Sam, Bob, Joe

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

Роландо
источник
Джинджа, как и Python, не использует !в качестве оператора отрицания. «не» пишется «не».
Wooble

Ответы:

306

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

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

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

{{ "," if not loop.last }}
Джо Дэй
источник
2
Это потрясающе, особенно в конце цикла в html
Sinux
7
Просто к вашему сведению, вам может потребоваться сделать это if / else в зависимости от ваших настроек. Больше информации. можно найти здесь: github.com/pallets/jinja/issues/710
Пол Калабро
1
или это в некоторых случаях{{ "," if not forloop.last }}
оботезать
5
Я второй комментарий о добавлении еще. Это сработало для меня{{ "," if not loop.last else "" }}
ахонг
197

Вы также можете использовать встроенный фильтр "join" ( http://jinja.pocoo.org/docs/templates/#join вот так:

{{ users|join(', ') }}
Ули Мартенс
источник
1
Хотя это работает для создания CSV, как видно из приведенного выше примера, его нельзя использовать с окружающим якорем.
триненатура
Этот подход также плохо работает с экранированием: ['{{[' a \ '', 'b'] | join ("','")}} '] производит [' a & # 39; & # 39; , & # 39; b ']
тушеное мясо
6
Это должно быть первой попыткой. Если это не работает, как нужно, попробуйте другое решение, но это, безусловно, самый чистый.
Джерад
Это дает запятую, как мне избавиться от этого?
Джонатан
У вас, вероятно, есть завершающий пустой элемент. Если у вас есть три элемента abc, вы получите aXbXc при соединении с X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens
61

И используя 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 %}
dalore
источник
1
Это на самом деле работает очень хорошо для меня, не оставляя запятой. Спасибо за это!
Даниэль Андрей Mincă