2016-11-15 6 views
3

私はtestJinja2のフレーム変数

from jinja2.utils import contextfunction 

@contextfunction 
def test(context): 
    context.get_all() 

グローバル機能を持​​っており、私のテストでは、私はこのようにそれを呼んでいる...

{% set i = 0 %} 
{% for j in range(0, 10) %} 
    {% set k = 0 %} 
    {{ test() }} 
{% endfor %} 

で終わる唯一の変数testcontextiです。 jkは「判読不能」です。 test(j, k)

+0

あなたは、テンプレートにコンテキストにインポートしていますか? (例: {%from 'admin/lib.html' render_form、render_field、render_form_fieldsとコンテキスト%}) – rll

+0

この例では、インポートはありません。コンパイルされたテンプレートに対して 'render'が呼び出され、' test() 'が' env ['globals'] 'に追加されます。 – Shaun

+0

j、kを関数に渡す必要があります。これらの変数はforブロックに対してローカルであり、グローバルコンテキストでは使用できません。 jは自明である。 ['{%set%}'がグローバルコンテキストに割り当てられないため、kはローカルです(https://github.com/pallets/jinja/issues/164)。 – approxiblue

答えて

2

github issue with a similar concernによれば、jkとして定義された変数は、グローバルに設定されず、ローカルに設定されます。関数に渡さない限り、呼び出す関数は変数kを認識しません。これは文書化された動作です。

関連stackoverflowの質問:

Can a Jinja variable's scope extend beyond in an inner block?

Jinja2: Change the value of a variable inside a loop

+1

これも私の結論でした。健全性チェックをするのは良いことです。あなたがローカルブロックにアクセスすることができないのが不思議そうです。 – Shaun

関連する問題