Jinja python şablonunda virgülle ayrılmış bir liste nasıl çıkarılır?


179

usersSöylemek bir listesi varsa ["Sam", "Bob", "Joe"], ben jinja şablon dosyama çıktı bir şey yapmak istiyorum:

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

Çıktı şablonu olmak istiyorum:

Sam, Bob, Joe

Döngünün son yinelemesinde olup olmadığını kontrol etmek için yukarıdaki kodu denedim ve eğer değilse, bir virgül eklemeyin, ancak çalışmıyor. Bunu nasıl yaparım?


jinja, Python gibi, !bir olumsuzlama operatörü olarak kullanmaz . "not" yazılır "not".
Wooble

Yanıtlar:


306

ifÇekinizin şu şekilde olmasını istiyorsunuz :

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

If If ifadesini kullanarak da kodu kısaltabileceğinizi unutmayın :

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

2
Bu, özellikle
html'deki

7
Sadece fyi, ayarlarınıza bağlı olarak bunu bir if / else yapmanız gerekebilir. Daha fazla bilgi. burada bulabilirsiniz: github.com/pallets/jinja/issues/710
Paul Calabro

1
veya bazı durumlarda{{ "," if not forloop.last }}
obotezat

5
Başka bir şey eklemeyle ilgili yorumu ikinci olarak verdim. Bu benim için çalıştı{{ "," if not loop.last else "" }}
ahong

197

yerleşik "birleştirme" filtresini de kullanabilirsiniz ( http://jinja.pocoo.org/docs/templates/# this katıl :

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

1
Bu, yukarıdaki örneğini görmek için bir csv oluşturmak için çalışırken, çevresindeki çapa ile kullanılamaz.
triunenature

Bu yaklaşım da kaçma ile iyi sonuç vermez: ['{{[' a \ '', 'b'] | join ("','")}} '] üretir [' a & # 39; & # 39; , & # 39; b ']
stewbasic

6
Denenen ilk şey bu olmalı. İstendiği gibi çalışmazsa, başka bir çözüm deneyin, ancak bu kesinlikle en temiz olanıdır.
Jerad

Bu bir virgül verir, bundan nasıl kurtulurum?
Jonathan

Muhtemelen bir boş elemanınız var. Eğer abc üç elementiniz varsa, X ile katılırken aXbXc alacaksınız:ansible -i localhost, all -m debug -a "msg=\"{{ [ 'a','b','c' ]|join('X') }}\""
Uli Martens

61

Ve kullanarak joinergelen http://jinja.pocoo.org/docs/dev/templates/#joiner

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

Tam olarak bu amaçla yapılmış. Normalde bir birleşim veya forloop.last'ın denetimi tek bir liste için yeterli olur, ancak birden fazla şey grubu için yararlıdır.

Neden kullanacağınıza dair daha karmaşık bir örnek.

{% 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
Bu, sondaki virgül bırakmadan benim için gerçekten iyi çalıştı. Bunun için teşekkürler!
Daniel Andrei Mincă

7

Aşağıdaki kod python3.5 kabuğunda önerilen jinja2 birleştirme filtresi Uli Martens kullanılarak çalıştı :

>>> users = ["Sam", "Bob", "Joe"]
>>> from jinja2 import Template
>>> template = Template("{{ users|join(', ') }}")
>>> template.render(users=users)
'Sam, Bob, Joe'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.