変数がまだ割り当てられておらず、ローカルコンテキスト内にある場合にのみ、変数値を設定したいと思います。jinjaコンテキスト関数で(グローバル以外の)変数を設定するにはどうすればよいですか?
だからこれに対する解決策があります:
{% with x=(x | default(1)) %}
{{ x }}
{% endwith %}
{% with x=2 %}
{% with x=(x | default(1)) %}
{{ x }}
{% endwith %}
{% endwith %}
これはうまく動作しますが、それは多くのテキストです。私は1つだけでなく、最大20の変数が設定されているマクロが呼び出されるか、それらの値にテンプレートが含まれる多くの状況があります。
これらのデフォルト条件をすべて書き込むことは単なる混乱であり、間違いを引き起こします。だから私は現在のコンテキストに値を設定することができたいと思っています。コンテキスト関数内で私は、次しようとした場合でも:
TypeError: 'Context' object does not support item assignment
そしてctx.vars上の値を設定しようとしているが、どちらかの役に立たない:
vars
The template local variables. This list contains environment and context functions from the parent scope as well as local modifications and exported variables from the template. The template will modify this dict during template evaluation but filters and context functions are not allowed to modify it.
http://jinja.pocoo.org/docs/2.9/api/#jinja2.Context.vars
I
は、私は例外を取得します試着しました@contextfunction
def defaults(ctx, **vals):
for k,v in vals.iteritems():
if k not in ctx.vars:
ctx.vars[k] = v
例外ではなく、コンテキストに値を割り当てていないようです。
私はグローバルな文脈に書くことができますが、それは副作用を引き起こすので、私がしたいことではありません。
現在のコンテキストだけを取得し、値を設定する可能性はありますか?私はそれについての指示を見つけられなかったし、これがどのように行われるかもしれないと私は本当にジンジャーのソースを読むことからそれを把握していませんでした。