テンプレート自体の内部でJinjaテンプレートで使用される変数のデフォルト値を設定したいと思います。Jinja2のドキュメントを見ると、これを行う方法がわかりません。私は何かを逃したことがありますか?「デフォルト」フィルターが表示されますが、使用ごとにではなく、値テンプレートを広く設定したいと思います。
私は1時間ほどかけて、拡張タグを作成するためのJinja2拡張機能の作成プロセスについて十分に学ぼうとしましたsetdefault
。これは次のようになります。
{% setdefault animal = 'wumpas' %}
割り当てられた名前が定義されていない場合、望ましい効果はタグと同等set
ですが、割り当てられた名前が定義されている場合は効果がありません。私はこれまでこれを機能させることができませんでした。
私の回避策は、jinjaを完全に回避し、複合ファイルを作成することです。特別なマーカーの前の領域はデフォルト値の(yaml)マッピングであり、マーカーの後の領域はjinjaテンプレートです。正常に機能しているように見えるこれの概念実証の実装は次のとおりです。
skel_text = """\
animal: wumpas
%%
The car carried my {{animal}} to the vet.
"""
class Error(Exception): pass
_skel_rx = re.compile(
r"""((?P<defaults>.*?)^%%[ \t]*\n)?(?P<template>.*)""",
re.MULTILINE|re.DOTALL)
_env = jinja2.Environment(trim_blocks=True)
def render(skel, **context):
m = _skel_rx.match(skel_text)
if not m:
raise Error('skel split failed')
defaults = yaml.load(m.group('defaults') or '{}')
template = _env.from_string(m.group('template') or '')
template.globals.update(defaults)
return template.render(**context)
print render(skel_text)
print render(skel_text, animal='cat')
それで、在庫のJinja2で同等のことを行う方法はありますか、またはどのように拡張機能を記述して目的の効果を達成することができますか?