2

いくつかのブロックを含む Jinja2 テンプレートがあるとします。

{% block A %}Blah{% endblock %}
{% block B %}whatever{% endblock %}
{% block C %}you get the idea{% endblock %}

ブロックごとに 1 つのエントリを持つ dict (または JSON など) に変換する Python 関数が必要です。したがって、出力は次のようになります。

{'A': 'Blah', 'B': 'whatever', 'C': 'you get the idea'}

これを行う確立された方法はありますか?

下位互換性を維持しながら、リロードするのではなく、AJAX を介してアプリケーションのページを更新したいので、私は尋ねています。Jinja2 テンプレートのブロックを解析できれば、まったく同じテンプレート ファイルを使用して、ページ全体またはページの一部を簡単に生成できます。それで、補助的な質問として...これについてもっと良い方法はありますか?

4

2 に答える 2

6

フィールドをチェックアウトできTemplate.blocksます。ブロックレンダー関数の辞書があります。

ブロックレンダー関数は、コンテキスト(推測)を引数として呼び出されるとジェネレーターを返します。

次のコード スニペットがお役に立てば幸いです。

    キーの場合、template.blocks.iteritems() の blockfun:
        print key, ':', ''.join(blockfun({}))

結果は次のとおりです。

    A : 何とか
    C : お分かりですね
    B : なんでも

于 2012-04-06T03:06:06.813 に答える
2

これはうまくいくようです:

from jinja2 import Template
from jinja2.utils import concat

t = """{% block A %}Blah{% endblock %}
{% block B %}whatever {{ a }}{% endblock %}
{% block C %}you get the idea{% endblock %}
"""

template = Template(t)
context = template.new_context({'a': 'AAAAAAAA'})
A = concat(template.blocks['A'](context))
B = concat(template.blocks['B'](context))
C = concat(template.blocks['C'](context))

print A
print B
print C

これにより、レンダリングされた 3 つのブロックのそれぞれが 3 つの個別の変数で得られます。

于 2012-04-06T03:10:04.330 に答える