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.