Як вивести список з обмеженими комами в шаблоні пітона jinja?


179

Якщо у мене є список usersскажу ["Sam", "Bob", "Joe"], я хочу зробити щось, де можу вивести у своєму файлі шаблону jinja:

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

Я хочу зробити, щоб вихідний шаблон був таким:

Sam, Bob, Joe

Я спробував вищевказаний код, щоб перевірити, чи був він на останній ітерації циклу, а якщо ні, то не вставляйте коску, але це не працює. Як це зробити?


jinja, як і Python, не використовується !як оператор заперечення. "не" пишеться "не".
Wooble

Відповіді:


306

Ви хочете, щоб ваш ifчек був:

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

Зауважте, що ви також можете скоротити код, використовуючи If Expression :

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

2
Це приголомшливо, особливо в кінці циклу в html
Sinux

7
Тільки фій, можливо, вам знадобиться зробити це if / else на основі ваших налаштувань. Більше інформації. можна знайти тут: github.com/pallets/jinja/isissue/710
Пол Калабро

1
або це деякі випадки{{ "," if not forloop.last }}
obotezat

5
Я другий коментар про додавання іншого. Це спрацювало для мене{{ "," if not loop.last else "" }}
Ahong

197

ви також можете використовувати вбудований фільтр "приєднатися" ( 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 %}

1
Це насправді спрацювало досить добре для мене, не залишаючи сліду коми. Дякую за це!
Даніель Андрій Мінка

7

Наступний код працював за допомогою фільтра приєднання jinja2 Uli Martens, запропонованого в оболонці python3.5:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.