Wie gebe ich eine durch Kommas getrennte Liste in der Jinja Python-Vorlage aus?

175

Wenn ich eine Liste mit usersWorten habe ["Sam", "Bob", "Joe"], möchte ich etwas tun, das ich in meiner Jinja-Vorlagendatei ausgeben kann:

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

Ich möchte die Ausgabevorlage wie folgt gestalten:

Sam, Bob, Joe

Ich habe versucht, mit dem obigen Code zu überprüfen, ob er sich in der letzten Iteration der Schleife befand. Wenn nicht, fügen Sie kein Komma ein, aber es funktioniert nicht. Wie mache ich das?

Rolando
quelle
jinja wird wie Python nicht !als Negationsoperator verwendet. "nicht" wird "nicht" geschrieben.
Wooble

Antworten:

301

Sie möchten, dass Ihr ifScheck lautet:

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

Beachten Sie, dass Sie den Code auch mit If Expression verkürzen können :

{{ "," if not loop.last }}
Joe Day
quelle
2
Dies ist fantastisch, besonders am Ende der Schleife in HTML
Sinux
7
Nur zu Ihrer Information, möglicherweise müssen Sie dies basierend auf Ihren Einstellungen zu einem if / else machen. Mehr Info. finden Sie hier: github.com/pallets/jinja/issues/710
Paul Calabro
1
oder ist einige Fälle{{ "," if not forloop.last }}
obotezat
5
Ich stimme dem Kommentar zum Hinzufügen eines anderen zu. Dies funktionierte für mich{{ "," if not loop.last else "" }}
ahong
197

Sie können auch den integrierten "Join" -Filter ( http://jinja.pocoo.org/docs/templates/#join) wie folgt verwenden :

{{ users|join(', ') }}
Uli Martens
quelle
1
Während dies für die Erstellung einer CSV funktioniert (siehe Beispiel oben), kann es nicht mit dem umgebenden Anker verwendet werden.
Triunenature
Dieser Ansatz funktioniert auch nicht gut mit Escape: ['{{[' a \ '', 'b'] | join ("','")}} '] erzeugt [' a & # 39; & # 39; , & # 39; b ']
stewbasic
6
Dies sollte das erste sein, was versucht wird. Wenn es nicht wie gewünscht funktioniert, versuchen Sie es mit einer anderen Lösung, aber diese ist definitiv am saubersten.
Jerad
Dies gibt ein nachfolgendes Komma. Wie kann ich das loswerden?
Jonathan
Sie haben wahrscheinlich ein nachfolgendes leeres Element. Wenn Sie drei Elemente abc haben, erhalten Sie aXbXc, wenn Sie sich mit X verbinden:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens
61

Und mit dem joinervon http://jinja.pocoo.org/docs/dev/templates/#joiner

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

Es ist genau für diesen Zweck gemacht. Normalerweise würde ein Join oder eine Überprüfung von forloop.last für eine einzelne Liste ausreichen, aber für mehrere Gruppen von Dingen ist es nützlich.

Ein komplexeres Beispiel, warum Sie es verwenden würden.

{% 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
quelle
1
Das hat bei mir eigentlich ganz gut funktioniert, ohne ein nachkommendes Komma zu hinterlassen. Danke für diesen!
Daniel Andrei Mincă
7

Der folgende Code funktionierte mit dem in der Python3.5-Shell vorgeschlagenen jinja2-Join-Filter Uli Martens:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
rok
quelle