13

テンプレート自体の内部で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で同等のことを行う方法はありますか、またはどのように拡張機能を記述して目的の効果を達成することができますか?

4

3 に答える 3

27

私にとってうまくいったのは、フィルターを使用することでした:

t = '''Hello {{name | default('John Doe')}}'''
于 2013-10-29T16:27:31.470 に答える
14

セット制御構造は、あなたが望むことを行うことができます。

テストに使用したコードを次に示します。

from jinja2 import Template
t = '''{% set name=name or "John Doe" %}Hello {{ name }}'''
template = Template(t)
print template.render(name='Jonnie Doe')
print template.render()

予想どおり、次のように出力されます。

Hello Jonnie Doe
Hello John Doe
于 2010-12-18T20:34:30.667 に答える