2012-08-14 38 views
12

Gördüğüm kadarıyla, bir nesnenin Jinja2'de bir Liste örneği olup olmadığını test etmenin bir yolu yoktur. İlk olarak, doğru ve ikinci olarak, Jinja2'de özel bir test/uzatma uygulayan var mı? Herhangi bir yardım harika olurdu.Jinja2 Listesinde Test Etme

cevap

9

Bu katmanı jinja2'de özel bir filtreyi kolayca yapabilirsiniz.

İlk size test yöntemini oluşturmak:

def is_list(value): 
    return isinstance(value, list) 

Ve bir özel süzgeç olarak ekleyin:

j = jinja2.Jinja2(app) 
j.environment.filters.update({ 
     'is_list': is_list, 
}) 
0

Jinja birçok yerleşik testleri vardır. Muhtemelen iterable'u arıyorsunuz.

{% if var is iterable %} 
+5

Ayrıca bir dize de yinelenebilir, bu yüzden çalışmaz – pors

+0

Ben de 'sequence' testini fark ettim ama aynı zamanda bir dizi bir dizi ele alır. –

18

benim kurulumda bu {% if var is iterable and var is not string %}

+1

benim durumumda {% eğer var% string ise}} mükemmel çalıştı; teşekkür ederim. – berto

-1

gibi yaptım, ben olmak bir dize veya Jinja şablonuna gelen dizeleri listesine birine bir değer için istiyorum. Yani gerçekten önemsediğim şey dizgeye karşılık değil, tek bir öğeye ve birden çok öğeye sahip değildi. Kullanım durumunuz benzer ise bu cevap yardımcı olabilir.

"Liste nedir?" Için yerleşik bir test olmadığından Ayrıca dizeleri reddeder, API tasarımından bir desen ödünç alıp, Python tarafındaki tek bir nesneyi sardım ve sonra Jinja tarafındaki liste uzunluğunu kontrol ettim.

Python:

context = { ... } 

# ex. value = 'a', or ['a', 'b'] 
if not isinstance(value, list): 
    value = [value] 

context['foo'] = value 

Jinja:

{% if foo|length == 1 %} 
    single-item list 
{% elif foo|length > 1 %} 
    multi-item list 
{% endif %} 

Ve yapmak istediğiniz tüm görüntüleme amacıyla bir öğe ayırıcısını eklemek ise, açık uzunluğu çek ve sadece {{ value|join(', ') }} atlayabilirsiniz

.

+0

Bu cevabı bir sebepten dolayı bir not düştüğü görülüyor. Benim için iyi çalışıyor, ancak bir şey işe yaramıyorsa yorum eklemek için çekinmeyin. –