Come produrre un elenco delimitato da virgole nel modello jinja python?


179

Se ho un elenco di cose da usersdire ["Sam", "Bob", "Joe"], voglio fare qualcosa in cui posso emettere nel mio file modello jinja:

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

Voglio fare in modo che il modello di output sia:

Sam, Bob, Joe

Ho provato il codice sopra per verificare se era sull'ultima iterazione del ciclo e, in caso contrario, non inserire una virgola, ma non funziona. Come faccio a fare questo?


jinja, come Python, non utilizza !come operatore di negazione. "non" è scritto "non".
Wooble,

Risposte:


306

Vuoi che il tuo ifassegno sia:

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

Nota che puoi anche abbreviare il codice usando If Expression :

{{ "," if not loop.last }}

2
Questo è fantastico, specialmente alla fine del ciclo in html
Sinux il

7
A proposito, potresti aver bisogno di renderlo un if / else in base alle tue impostazioni. Ulteriori informazioni. può essere trovato qui: github.com/pallets/jinja/issues/710
Paul Calabro

1
o in alcuni casi{{ "," if not forloop.last }}
obotezat,

5
Secondo il commento sull'aggiunta di un altro. Questo ha funzionato per me{{ "," if not loop.last else "" }}
circa il

197

potresti anche usare il filtro "join" incorporato ( http://jinja.pocoo.org/docs/templates/#join in questo modo:

{{ users|join(', ') }}

1
Mentre questo funziona per creare un CSV, visto il suo esempio sopra, non può essere usato con l'ancora circostante.
triunenatura,

Anche questo approccio non funziona bene con l'escaping: ['{{[' a \ '', 'b'] | join ("','")}} '] produce [' a & # 39; & # 39; , & # 39; b ']
stewbasic

6
Questa dovrebbe essere la prima cosa tentata. Se non funziona come desiderato, prova un'altra soluzione, ma questa è sicuramente la più pulita.
Jerad,

Questo dà una virgola finale, come posso liberarmene?
Jonathan,

Probabilmente hai un elemento vuoto finale. Se hai tre elementi abc otterrai aXbXc quando ti unisci a X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens,

61

E usando il joinerda http://jinja.pocoo.org/docs/dev/templates/#joiner

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

È fatto per questo preciso scopo. Normalmente un join o un controllo di forloop.last sarebbe sufficiente per un singolo elenco, ma per più gruppi di cose è utile.

Un esempio più complesso sul perché lo useresti.

{% 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
Questo in realtà ha funzionato abbastanza bene per me, senza lasciare una virgola finale. Grazie per questo!
Daniel Andrei Mincă,

7

Il seguente codice ha funzionato usando il filtro join jinja2 suggerito da Uli Martens nella shell python3.5:

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.