Bagaimana cara menghasilkan daftar yang dibatasi koma di templat jinja python?

179

Jika saya memiliki daftar userssay ["Sam", "Bob", "Joe"], saya ingin melakukan sesuatu di mana saya dapat menampilkan dalam file template jinja saya:

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

Saya ingin membuat templat keluaran menjadi:

Sam, Bob, Joe

Saya mencoba kode di atas untuk memeriksa apakah itu pada iterasi terakhir dari loop dan jika tidak, maka jangan masukkan koma, tetapi tidak berhasil. Bagaimana saya melakukan ini?

Rolando
sumber
jinja, seperti Python, tidak digunakan !sebagai operator negasi. "tidak" dieja "tidak".
Wooble

Jawaban:

306

Anda ingin ifcek Anda menjadi:

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

Perhatikan bahwa Anda juga dapat mempersingkat kode dengan menggunakan Jika Ekspresi :

{{ "," if not loop.last }}
Joe Day
sumber
2
Ini luar biasa, terutama pada akhir loop dalam html
Sinux
7
Hanya fyi, Anda mungkin perlu membuat ini jika / lain berdasarkan pengaturan Anda. Info lebih lanjut. dapat ditemukan di sini: github.com/pallets/jinja/issues/710
Paul Calabro
1
atau beberapa kasus{{ "," if not forloop.last }}
obotezat
5
Saya komentar kedua tentang menambahkan yang lain. Ini bekerja untuk saya{{ "," if not loop.last else "" }}
ahong
197

Anda juga bisa menggunakan filter "gabung" bawaan ( http://jinja.pocoo.org/docs/templates/#join seperti ini:

{{ users|join(', ') }}
Uli Martens
sumber
1
Meskipun ini berfungsi untuk membuat csv, melihat contohnya di atas, itu tidak dapat digunakan dengan jangkar di sekitarnya.
triunenature
Pendekatan ini juga tidak bekerja dengan baik dengan melarikan diri: ['{{[' a \ '', 'b'] | join ("','")}} '] menghasilkan [' a & # 39; & # 39; , & # 39; b ']
stewbasic
6
Ini harus menjadi hal pertama yang dicoba. Jika tidak berfungsi seperti yang diinginkan, cobalah solusi lain, tetapi ini jelas yang paling bersih.
Jerad
Ini memberikan koma trailing, bagaimana saya menyingkirkan itu?
Jonathan
Anda mungkin memiliki elemen kosong tambahan. Jika Anda memiliki tiga elemen abc, Anda akan mendapatkan aXbXc saat bergabung dengan X:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens
61

Dan menggunakan joinerdari http://jinja.pocoo.org/docs/dev/templates/#joiner

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

Itu dibuat untuk tujuan yang tepat ini. Biasanya bergabung atau cek forloop. Terakhir akan cukup untuk satu daftar, tetapi untuk beberapa kelompok hal itu berguna.

Contoh yang lebih kompleks tentang mengapa Anda akan menggunakannya.

{% 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
sumber
1
Ini sebenarnya bekerja cukup baik untuk saya, tanpa meninggalkan tanda koma. Terima kasih untuk yang ini!
Daniel Andrei Mincă
7

Kode berikut berfungsi menggunakan filter gabung jinja2 yang disarankan Uli Martens di python3.5 shell:

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