2012-12-19 24 views
11

Diyelim ki bir şablon nesnesi oluşturdum (environment.from_string(template_path) kullanarak). Oluşturulan şablonda verilen değişken adının mevcut olup olmadığını kontrol etmek mümkün mü?Jinja2 şablonunda verilen değişkenin mevcut olup olmadığı nasıl kontrol edilir?

I (bir şey aslında "x için metin" ya da olmasın yerini olacağını eğer)

template.render(x="text for x") 

herhangi bir etkisi olacağını, olmadığını bilmek istiyorum. X değişkeninin var olup olmadığını nasıl kontrol edebilirim? belgelerine

+1

Do şablonu oluşturmadan önce veya şablonda değişkeni kontrol etmek ister misiniz? – munk

+1

Görüntülemeden önce! Oluşturma efektinin herhangi bir anlam ifade edip etmediğini kontrol etmem gerekiyor ... –

+1

Yani, x değişkeninin şablonda gerçekten referans alınmış olduğunu kontrol etmek ister misiniz? – munk

cevap

25

:

tanımlı (değer) değişken tanımlanır true

Dönüş:

{% if variable is defined %} 
    value of variable: {{ variable }} 
{% else %} 
    variable is not defined 
{% endif %} 
See the default() filter for a simple way to set undefined variables. 

DÜZENLEME: bir değer geçirildi eğer bilmek istiyorum görünüyor oluşturma bağlamında. Bu durumda, değerlendirilecek şablonlarda kullanılan tüm değişkenlerin bir listesini döndürecek jinja2.meta.find_undeclared_variables'u kullanabilirsiniz.

+1

Tam olarak kastettiğimden değil - Şablon metninde {{variable}} parçanın var olup olmadığını kontrol etmem gerekiyor. –

-2

Bunu yapamazsınız.

Şablonu ayrıştırabileceğinizi ve referanslar olup olmadığını görmek için AST'yi yürütebileceğinizi varsayalım, ancak bu biraz karmaşık bir kod olacaktır.

+1

Benim için kötü haberler getirdin. Böyle ayrıştırma için herhangi bir öneri sunabilir misiniz? Jinja2 muhtemelen her neyse, bu sürecin etkilerine erişim elde etmek mümkün olup olmadığını merak ediyorum. –

1

Bunun en iyi yol olup olmadığından emin değilim, ya da her durumda işe yarayacaksa, ancak bir dizeyle oluşturduğunuzdan ya da bir dizede şablon metnine sahip olduğunuzu varsayalım Programınız kaynak şablonu bir dizgeye okudu.

'{{ x.foo }}' 

ya da ben yakalandı istisna: Ben düzenli ifade kütüphanesi kullanmak istiyorsunuz

,

>>> import re 
>>> template = "{% block body %} This is x.foo: {{ x.foo }} {% endblock %}" 
>>> expr = "\{\{.*x.*\}\}" 
>>> result = re.search(expr, template) 
>>> try: 
>>>  print result.group(0) 
>>> except IndexError: 
>>>  print "Variable not used" 

yeniden sonuç olacaktır

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: no such group 

"yazdırır Değişken kullanılmaz "

İlgili konular