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?


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 }}

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(', ') }}

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 %}

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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.