Comment générer une liste délimitée par des virgules dans un modèle jinja python?

179

Si j'ai une liste de usersdire ["Sam", "Bob", "Joe"], je veux faire quelque chose où je peux sortir dans mon fichier de modèle jinja:

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

Je veux que le modèle de sortie soit:

Sam, Bob, Joe

J'ai essayé le code ci-dessus pour vérifier s'il s'agissait de la dernière itération de la boucle et sinon, n'insérez pas de virgule, mais cela ne fonctionne pas. Comment puis-je faire cela?

Rolando
la source
jinja, comme Python, ne l'utilise pas !comme opérateur de négation. "non" est orthographié "non".
Wooble

Réponses:

306

Vous voulez que votre ifchèque soit:

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

Notez que vous pouvez également raccourcir le code en utilisant If Expression :

{{ "," if not loop.last }}
Joe Day
la source
2
C'est génial, surtout à la fin de la boucle en html
Sinux
7
Juste pour info, vous devrez peut-être en faire un if / else en fonction de vos paramètres. Plus d'informations. peut être trouvé ici: github.com/pallets/jinja/issues/710
Paul Calabro
1
ou est certains cas{{ "," if not forloop.last }}
obotezat
5
J'appuie le commentaire sur l'ajout d'un autre. Cela a fonctionné pour moi{{ "," if not loop.last else "" }}
ahong
197

vous pouvez également utiliser le filtre "join" intégré ( http://jinja.pocoo.org/docs/templates/#join comme ceci:

{{ users|join(', ') }}
Uli Martens
la source
1
Bien que cela fonctionne pour créer un csv, voir son exemple ci-dessus, il ne peut pas être utilisé avec l'ancre environnante.
triunenature
Cette approche ne fonctionne pas bien non plus avec l'échappement: ['{{[' a \ '', 'b'] | join ("','")}} '] produit [' a & # 39; & # 39; , & # 39; b ']
stewbasic
6
Cela devrait être la première chose à tenter. Si cela ne fonctionne pas comme vous le souhaitez, essayez une autre solution, mais c'est certainement la plus propre.
Jerad
Cela donne une virgule, comment puis-je m'en débarrasser?
Jonathan
Vous avez probablement un élément vide à la fin. Si vous avez trois éléments abc, vous obtiendrez aXbXc en rejoignant X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens
61

Et en utilisant le joinerde http://jinja.pocoo.org/docs/dev/templates/#joiner

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

Il est fait exactement dans ce but. Normalement, une jointure ou une vérification de forloop.last suffirait pour une seule liste, mais pour plusieurs groupes de choses, c'est utile.

Un exemple plus complexe sur la raison pour laquelle vous l'utiliseriez.

{% 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
la source
1
Cela a plutôt bien fonctionné pour moi, sans laisser de virgule. Merci pour celui-ci!
Daniel Andrei Mincă
7

Le code suivant a fonctionné en utilisant le filtre de jointure jinja2 suggéré par Uli Martens dans le shell python3.5:

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