2017-09-04 27 views
0

変数がまだ割り当てられておらず、ローカルコンテキスト内にある場合にのみ、変数値を設定したいと思います。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 

例外ではなく、コンテキストに値を割り当てていないようです。

私はグローバルな文脈に書くことができますが、それは副作用を引き起こすので、私がしたいことではありません。

現在のコンテキストだけを取得し、値を設定する可能性はありますか?私はそれについての指示を見つけられなかったし、これがどのように行われるかもしれないと私は本当にジンジャーのソースを読むことからそれを把握していませんでした。

答えて

0

私は解決策を見つけました。何とか自分の問題を解決し続けます。 の質問に対する答えは正確ではありません。「ジンジャーコンテキスト関数で(非グローバル)変数を設定するにはどうすればよいですか?が問題を解決します。

私は、単純な「デフォルト」タグを可能神社の拡張子を、書かれている:

from jinja2 import nodes 
from jinja2.ext import Extension 

""" 
    DefaultExtension 
    ~~~~~~~~~~~~~~~~ 
    Very simple jinja extension that allows for the following 

    {% set x=(x | default(1)) %} 
    {% set y=(y | default(2)) %} 

    to be written as 

    {% default x=1, y=2 %} 

    :copyright: (c) 2017 by the Roman Seidl 
    :license: BSD 
""" 

class DefaultExtension(Extension): 
    # a set of names that trigger the extension. 
    tags = set(['default']) 

    def parse(self, parser): 
     #just dump the tag 
     lineno = next(parser.stream).lineno 

     #parse through assignments (similar to parser.parse_with) 
     assignments = [] 
     while parser.stream.current.type != 'block_end': 
      lineno = parser.stream.current.lineno 
      if assignments: 
       parser.stream.expect('comma') 
      target = parser.parse_assign_target() 
      parser.stream.expect('assign') 
      expr = (parser.parse_expression()) 
      #consruct a 'default' filter 
      filter = nodes.Filter(nodes.Name(target.name, 'load'), 'default', [expr], [], None, None, lineno=lineno) 
      #produce an assignment with this filter as value 
      assignment = nodes.Assign(target, filter, lineno=lineno) 
      assignments.append(assignment) 
     return assignments 

私はちょうど私のアプリに追加しました:

app.jinja_env.add_extension(DefaultExtension) 

をして、それは非常にうまく動作します私はまだ完全にそれをテストしていないと告白する必要がありますが、

私はこれを神社に提出する必要があると思いますか?

関連する問題