web-dev-qa-db-ja.com

指定された変数がjinja2テンプレートに存在するかどうかを確認するにはどうすればよいですか?

たとえば、テンプレートオブジェクトを作成したとします(つまり、environment.from_string(template_path)を使用します)。作成したテンプレートに特定の変数名が存在するかどうかを確認できますか?

知りたいのですが

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

何らかの効果があります(何かが実際に「textforx」に置き換えられるかどうか)。変数xが存在するかどうかを確認する方法は?

14

ドキュメントから:

defined(value)

変数が定義されている場合は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 を使用できます。これにより、評価するテンプレートで使用されているすべての変数のリストが返されます。

32
jeffknupp

これが最善の方法であるかどうか、またはすべての場合に機能するかどうかはわかりませんが、文字列で作成したか、プログラムが読み取ったため、文字列にテンプレートテキストがあると想定しますソーステンプレートを文字列に変換します。

正規表現ライブラリを使用します。

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

「変数は使用されていません」と出力されます

1
munk