2012-12-19 7 views
11

Załóżmy, że utworzyłem obiekt szablonu (np. Przy użyciu environment.from_string(template_path)). Czy możliwe jest sprawdzenie, czy podana nazwa zmiennej istnieje w stworzonym szablonie?Jak sprawdzić, czy podana zmienna istnieje w szablonie jinja2?

Chciałbym wiedzieć, czy

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

miałoby żadnego wpływu (jeśli coś będzie faktycznie zastąpione przez „x” dla tekstu lub nie). Jak sprawdzić, czy istnieje zmienna x?

+1

Do chcesz sprawdzić zmienną przed renderowaniem szablonu lub w szablonie? – munk

+1

Przed renderowaniem! Muszę sprawdzić, czy efekt renderowania miałby jakiś sens ... –

+1

A więc chcesz sprawdzić, czy zmienna x jest rzeczywiście odniesiona w szablonie? – munk

Odpowiedz

25

Z dokumentacji:

zdefiniowana (wartość)

Return true, jeśli zmienna jest zdefiniowana:

{% 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. 

EDIT: Wydaje chcesz wiedzieć, czy wartość przekazana w kontekście renderowania. W takim przypadku możesz użyć jinja2.meta.find_undeclared_variables, która zwróci ci listę wszystkich zmiennych używanych w szablonach do oceny.

+1

Nie dokładnie to, co miałem na myśli - muszę sprawdzić, czy fragment '{{variable}}' występuje w tekście szablonu, czy nie. –

-2

Nie możesz tego zrobić.

Przypuszczam, że można sparsować szablon, a następnie przejść AST, aby sprawdzić, czy istnieją odniesienia, ale to byłby nieco skomplikowany kod.

+1

Przyniosłeś dla mnie złe wieści. Czy możesz podać jakieś sugestie dotyczące takiego parsowania? Jinja2 prawdopodobnie i tak to analizuje, zastanawiam się, czy możliwe jest uzyskanie dostępu do efektów tego procesu. –

1

Nie jestem pewien, czy jest to najlepszy sposób, czy też będzie działać we wszystkich przypadkach, ale zakładam, że masz tekst szablonu w ciągu znaków, ponieważ utworzyłeś go za pomocą ciągu lub Twój program przeczytał szablon źródłowy w ciągu znaków.

użyłbym regularne biblioteki ekspresyjnej, ponownie

>>> 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" 

Rezultatem będzie:

'{{ x.foo }}' 

lub rzucać wyjątek złapałem:

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

który będzie drukować " Zmienna nieużywana "