6

ジャンゴでは、これを行うことができます:

views.py : 

    def A(request):
        context = {test : 'test'}
        return render_to_response('index.html', context , context_instance = RequestContext(request))

    def B(request):
        context = {}
        return render_to_response('index.html', context , context_instance = RequestContext(request))

index.html:

        {% if test %}
            {{ test }}
        {% endif %}

method Bそして、変数'test'が存在しない場所でを使用しても、テンプレートをエラーなしでレンダリングしますが、それでもテンプレートに入れることができます。

controller で pylons + mako で同じことをしたい:

foo.py

    def A(self):
        c.test = 'test'
        return render('index.html')

    def B(self):
        return render('index.html')

index.html :

        % if c.test:
            ${'c.test'}
        % endif

Django ではそれを行うことができますが、Pylons ではエラーが発生します'c.test'。存在するかどうかを確認する方法はありますか?

エラー: AttributeError: 'ContextObj' オブジェクトに属性 'test' がありません

4

3 に答える 3

9

同じテンプレートを使用して複数のビューがあり、変数が設定されているかどうかをテストする必要があるという同様の問題がありました。クリスが参照したドキュメントを見て、設定方法に関係なく、この問題を解決する別の方法を見つけましたmako.strict_undefined。基本的get()に、オブジェクトのメソッドを呼び出しcontextます。あなたの例では、次のことができます。

% if context.get('test', UNDEFINED) is not UNDEFINED:
  ${test}
% endif

また

${context.get('test', '')}

存在する場合と同じよう${test}に出力し、存在しない場合は空の文字列を出力します。

残念ながら、最も直感的なin演算子を使用できないようです。context

于 2013-07-09T17:47:52.923 に答える
8

コンテキスト変数に関する mako Docsから:

% if someval is UNDEFINED:
    someval is: no value
% else:
    someval is: ${someval}
% endif

ドキュメントでは、これを現在のコンテキストにない変数名を参照していると説明しています。Mako はこれらの変数を value に設定しますUNDEFINED

次のように変数をチェックします。

% if not someval is UNDEFINED:
    (safe to use someval)

ただし、pylons/pyramid にstrict_undefined=True設定がある場合、未定義の変数を使用しようとすると、NameError発生します。設定されていない変数を空の文字列に単純に置き換えるのではなく、Python の哲学と一致しているように見えます。これを見つけるのにしばらく時間がかかりましたが、Mako ランタイムのセクション全体を読むと、Makoがどのようにコンテキスト変数を受け取り、設定し、使用するかが明確になります。

編集
完成のために、ドキュメントはここstrict_undefinedで設定を説明しています。この変数は、.ini ファイルの 1 つに設定することで変更できます。

[app:main]
...
mako.strict_undefined = false
于 2012-08-17T13:32:28.423 に答える
0

少し遅いので、コントローラーに存在しないテンプレートで変数を使用するたびに、pylons はエラーを発生させます。エラーを無効にするには、これを environment.py に入れるだけです:

config['pylons.strict_tmpl_context'] = False
于 2012-08-18T08:32:46.983 に答える