Как проверить, существует ли данная переменная в шаблоне jinja2?
Скажем, я создал объект шаблона (например, используя environment.from_string(template_path)
). Можно ли проверить, существует ли данное имя переменной в созданном шаблоне?
Я хотел бы знать, если
template.render(x="text for x")
будет иметь какой-либо эффект (если что-то будет заменено на "text for x" или нет). Как проверить, существует ли переменная x?
Ответы
Ответ 1
Из документации:
определен (значение)
Возвращает true, если определена переменная:
{% 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:
Кажется, вы хотите знать, было ли передано значение в контексте рендеринга. В этом случае вы можете использовать jinja2.meta.find_undeclared_variables, который вернет вам список всех переменных, используемых в шаблонах, которые будут оцениваться.
Ответ 2
Я не уверен, что это лучший способ, или если он будет работать во всех случаях, но я предполагаю, что у вас есть текст шаблона в строке, потому что вы создали его с помощью строки или вашего программа прочитала исходный шаблон в строке.
Я бы использовал библиотеку регулярных выражений, re
>>> 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"
Результат будет:
'{{ x.foo }}'
или выбросить исключение, которое я поймал:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: no such group
который будет печатать "Variable not used"
Ответ 3
Вы не можете этого сделать.
Я предполагаю, что вы можете проанализировать шаблон, а затем пройти АСТ, чтобы увидеть, есть ли ссылки, но это будет несколько сложный код.