2013-07-29 49 views
6
{% set disabled = '' %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% set disabled = 'disabled' %} 
    {% endif %} 
    {{ disabled }} # outputs: 'disabled' 
{% endfor %} 
{{ disabled }} # outputs: '' 

私はJinja2にそのテンプレートを持っています。 私が必要とするのは、 'for'ループの外側に 'disabled'変数が見えるようにすることです。 これは可能ですか?デフォルトのブロックによるJinja2:ローカル/グローバル変数

答えて

10

をこれを処理する最も簡単な方法は、移動することですビュー機能に変数disabledを設定し、使用準備が整ったテンプレートに送信するロジックです。アプリケーションロジックとプレゼンテーションを混在させることはお勧めできません。テンプレートはできるだけ消化されたデータを受け取るべきです。

これは、あなたが可能にしてくれる醜いハックがあると言いました。答えはthis questionです。

この解決策では、Jinja2の拡張子としてdoを有効にし、それを使用してグローバルアレイを変更します。拡張の使用を有効にするには:ここで

app.jinja_env.add_extension('jinja2.ext.do') 

はあなたの例に適応ソリューションです:

{% set disabled = [] %} 
{% for voter in record.voters %} 
    {% if user == voter %} 
     {% do disabled.append(1) %} 
    {% endif %} 
{% endfor %} 
{% if disabled %} 
    disabled 
{% endif %} 
+0

thx 。私はすでに自分のコードを改訂し、最初に提案したようにしました。 –

0

は、外側のスコープの変数にアクセスすることはできません、あなたはそうのようなscoped修飾子を使用することによって、これをオーバーライドすることができます。

{% for item in list scoped %} 
{% endfor %} 

参照:http://jinja.pocoo.org/docs/templates/#block-nesting-and-scope

+1

それはしませんでした! Loop以外のブロックでScopedが動作する –

+0

@ c00p3r.webそのような場合、jinja2の問題を開くことをお勧めします。https://github.com/mitsuhiko/jinja2/issues –

6

ミゲルが示唆のようにあなたは、配列/辞書を使用することができますが、それ自体が行う拡張を必要としません;ダミーvarを設定することができます。私のコードで、その後上部に

{% set glob={} %} 

、および:私は、以下を使用

{% set _ = glob.update({'disabled':True}) %} 

_変数あなたが後でそれを使用しない、単なるダミーです。

0

私は古いスレッドに答えていることを実感します。しかし、私は最近Jinjaを使い始め、同様の問題に遭遇しました。入れ子になったサイクルで印刷された行の数を数える必要がありました。私の解決策は、クラスのカウンタ変数をラップし、インスタンスをテンプレートに渡すことでした。同様に、あなたはそれに応じて

{% for voter in record.voters %} 
    {% if user == voter %} 
     {% status.set_disabled() %} 
    {% endif %} 
    {{ status }} # outputs: 'disabled' 
{% endfor %} 

は、レンダリングのためのテンプレートにステータスクラスのインスタンスを渡すので

class VoterStatus(object): 
    def __init__(self, status='active'): 
     self._status = status 

    def set_disabled(self): 
     self._status = 'disabled' 

    def __str__(self): 
     return self._status 

があなたのテンプレートを変更し同様に、ラッパークラスを使用することができます。

tmplt.render(status=VoterStatus(), ...) 

を...ボブはあなたの叔父です。

関連する問題