Jak wyświetlić listę rozdzielaną przecinkami w szablonie Jinja Python?

179

Jeśli mam listę userspowiedz ["Sam", "Bob", "Joe"], chcę zrobić coś, co mogę wyprowadzić w moim pliku szablonu jinja:

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

Chcę, aby szablon wyjściowy był:

Sam, Bob, Joe

Wypróbowałem powyższy kod, aby sprawdzić, czy był na ostatniej iteracji pętli, a jeśli nie, to nie wstawiaj przecinka, ale nie działa. Jak mam to zrobic?

Rolando
źródło
jinja, podobnie jak Python, nie używa !jako operatora negacji. „nie” jest zapisywane jako „nie”.
Wooble

Odpowiedzi:

306

Chcesz, aby Twój ifczek był:

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

Zwróć uwagę, że możesz również skrócić kod, używając wyrażenia If :

{{ "," if not loop.last }}
Joe Day
źródło
2
To jest niesamowite, szczególnie pod koniec pętli w html
Sinux
7
Po prostu fyi, być może będziesz musiał ustawić to jako if / else na podstawie twoich ustawień. Więcej informacji. można znaleźć tutaj: github.com/pallets/jinja/issues/710
Paul Calabro
1
lub jest w niektórych przypadkach{{ "," if not forloop.last }}
obotezat
5
Popieram komentarz o dodaniu innego. To zadziałało dla mnie{{ "," if not loop.last else "" }}
ahong
197

możesz także użyć wbudowanego filtru „dołącz” ( http://jinja.pocoo.org/docs/templates/#join w następujący sposób:

{{ users|join(', ') }}
Uli Martens
źródło
1
Chociaż działa to przy tworzeniu pliku csv, widząc jego przykład powyżej, nie można go używać z otaczającą kotwicą.
triunatura
To podejście nie działa również dobrze w przypadku ucieczki: ['{{[' a \ '', 'b'] | join ("','")}} '] daje [' a '' ' , & # 39; b ']
stewbasic
6
To powinna być pierwsza próba. Jeśli nie działa zgodnie z oczekiwaniami, wypróbuj inne rozwiązanie, ale jest to zdecydowanie najczystsze.
Jerad
Na końcu pojawia się przecinek, jak się tego pozbyć?
Jonathan
Prawdopodobnie masz końcowy pusty element. Jeśli masz trzy elementy abc, otrzymasz aXbXc łącząc się z X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens
61

I korzystając joinerz http://jinja.pocoo.org/docs/dev/templates/#joiner

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

Jest stworzony do tego właśnie celu. Normalnie złączenie lub sprawdzenie forloop.last wystarczyłoby dla pojedynczej listy, ale dla wielu grup rzeczy jest to przydatne.

Bardziej złożony przykład, dlaczego chcesz go używać.

{% 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
źródło
1
W moim przypadku działało to całkiem nieźle, bez pozostawienia przecinka na końcu. Dzięki za to!
Daniel Andrei Minca
7

Poniższy kod działał przy użyciu filtru złączania jinja2, sugerowanego przez Uli Martensa w powłoce python3.5:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
rok
źródło