web-dev-qa-db-fra.com

Comment sortir une liste délimitée par des virgules dans jinja python template?

Si j'ai une liste de users dis ["Sam", "Bob", "Joe"], Je veux faire quelque chose pour lequel 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 si c'était sur 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?

146
Rolando

Vous voulez que votre chèque if soit:

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

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

{{ "," if not loop.last }}
241
Joe Day

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

{{ users|join(', ') }}
166
Uli Martens

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

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

C'est fait dans ce but précis. Normalement, une jointure ou une vérification de forloop.last suffirait pour une liste unique, mais elle serait utile pour plusieurs groupes de choses.

Un exemple plus complexe expliquant pourquoi 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 %}
57
dalore