web-dev-qa-db-ja.com

Jinja 2テンプレートから現在の変数のリストを取得するにはどうすればよいですか?

次のようにJinja2テンプレートを返す場合:return render_response('home.htm', **context)

次に、テンプレート内からコンテキスト内の変数のリストを取得するにはどうすればよいですか?

24
Christian

技術的には、コンテキストは名前付き辞書として渡されないため、テンプレート内からコンテキスト変数のリストを生成するには少し作業が必要です。しかし、それは可能です。

  1. Jinjaコンテキスト関数 を定義して、本質的にグローバル変数/関数の辞書であるjinja2.Contextオブジェクトを返します。

  2. その関数をグローバル名前空間で使用できるようにします。つまり、jinja2.Environmentまたはjinja2.Templateグローバル辞書

  3. オプションで、コンテキストからオブジェクトをフィルタリングします。たとえば、callable()を使用して、Jinjaのデフォルトのグローバルヘルパー関数(範囲、ジョイナーなど)をスキップします。これは、コンテキスト関数またはテンプレートで実行できます。それが最も理にかなっているところならどこでも。

例:

>>> import jinja2
>>> 
>>> @jinja2.contextfunction
... def get_context(c):
...         return c
... 
>>> tmpl = """ 
... {% for key, value in context().items() %}
...     {% if not callable(value) %}
...         {{ key }}:{{ value }}
...     {% endif %}
... {% endfor %}
... """
>>> 
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>> 
>>> print(template.render(**context))
        a:1
        c:3
        b:2

[または、render_response('home.htm', context=context)と一緒に呼び出して、他のソリューションを機能させます。]

36
Garrett

取得する方法は次のとおりです @ crewbumの回答 Flask app:

import jinja2

@jinja2.contextfunction
def get_context(c):
    return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
3
joemaller

@ Garrettの答え は私が望んでいたよりも少し複雑であることがわかりました。コンテキストのクローンをコンテキスト自体に追加することで、コンテキストを簡単に検査できることがわかりました。

contextCopy = dict(context)
context['all'] = contextCopy

そして、それを<pre>{{ all|pprint }}</pre>を使用してJinjaテンプレートにプリティプリントします。

0
Jo Sprague