67

次の Jinja テンプレートがあります。

{% set mybool = False %}
{% for thing in things %}
    <div class='indent1'>
        <ul>
            {% if current_user %}
              {% if current_user.username == thing['created_by']['username'] %}
                {% set mybool = True %}
                <li>mybool: {{ mybool }}</li> <!-- prints True -->
                <li><a href='#'>Edit</a></li>
              {% endif %}
            {% endif %}
            <li>Flag</li>
        </ul>
    </div>
    <hr />
{% endfor %}

{% if not mybool %}
    <!-- always prints this -->
    <p>mybool is false!</p>
{% else %}
  <p>mybool is true!</p>
{% endif %}

ループで条件が満たされた場合は、下に表示できるように trueforに変更したいと思います。ただし、インナーのスコープはステートメントに限定されているように見えるため、目的が設定されることはありません。myboolmybool is true!myboolif mybool

「グローバル」を設定myboolして、最後のifステートメントで使用できるようにするにはどうすればよいですか?

編集

いくつかの提案(正しくキャッシュされたページ ビューのみ)を見つけましたが、それらは機能していないようです。おそらく、Jinja2では廃止されています...

編集

以下に提供されるソリューション。上記の提案がなぜうまくいかないのか、私はまだ興味があります。それらが廃止されたことを誰かが確実に知っていますか?

4

8 に答える 8

53

この制限を回避する1つの方法は、「do」式ステートメント拡張を有効にして、ブール値の代わりに配列を使用することです。

{% set exists = [] %}
{% for i in range(5) %}
      {% if True %}
          {% do exists.append(1) %}
      {% endif %}
{% endfor %}
{% if exists %}
    <!-- exists is true -->
{% endif %}

Jinjaの「do」式ステートメント拡張を有効にするには:e = jinja2.Environment(extensions=["jinja2.ext.do",])

于 2011-02-02T22:00:57.320 に答える
4

a または類似のものを書いているときcontextfunction()に、コンテキストが変更を阻止しようとしていることに気付いたかもしれません。

内部コンテキスト API を使用してコンテキストを変更できた場合、コンテキストの変更がテンプレートに表示されていないように見えることに気付いたかもしれません。これはJinja、パフォーマンス上の理由から、テンプレート変数のプライマリ データ ソースとしてのみコンテキストを使用するためです。

コンテキストを変更したい場合は、set を使用して変数に代入できる代わりに、変数を返す関数を作成します。

{% set comments = get_latest_comments() %}

ソース

于 2011-10-05T12:53:04.740 に答える