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?


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

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

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

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'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.