18

假设,我创建了一个模板对象(fe using environment.from_string(template_path))。是否可以检查创建的模板中是否存在给定的变量名称?

我想知道,如果

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

会产生任何影响(如果某些东西实际上会被“x 的文本”替换)。如何检查变量 x 是否存在?

4

3 回答 3

40

从文档中:

定义(值)

如果定义了变量,则返回 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.

编辑:您似乎想知道是否将值传递给渲染上下文。在这种情况下,您可以使用jinja2.meta.find_undeclared_variables,它将返回您要评估的模板中使用的所有变量的列表。

于 2012-12-19T16:29:54.013 回答
1

我不确定这是否是最好的方法,或者它是否适用于所有情况,但我假设您在字符串中有模板文本,或者是因为您使用字符串创建了它,或者您的程序已读取源模板转换为字符串。

我会使用正则表达式库,重新

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

这将打印“未使用的变量”

于 2012-12-24T16:40:15.977 回答
-4

你不能那样做。

我想您可以解析模板,然后通过 AST 来查看是否有引用,但这将是一些复杂的代码。

于 2012-12-19T16:32:26.317 回答