web-dev-qa-db-ja.com

Jinja2ネストループカウンター

{% set cnt = 0 %}
{% for room in rooms %}
  {% for bed in room %}
    {% set cnt = cnt + 1 %}
  {% endfor %}
{{ cnt }}
{% endfor %}

ネストされたループがあるとすると、出力されたcntは常に0になります。これは、最初のforループに入ったときに定義されたものだからです。内側のループでカウンターをインクリメントすると、それは内側のループのローカル変数にすぎないように見えます。したがって、ループ内でインクリメントされますが、そのローカルcntはなくなります。グローバルcntをどのように変更できますか?

Jinja2のドキュメントは素晴らしいかもしれませんが、変数スコープの設定については不明です。スコープについて言及しているのは、内部ブロックの「スコープ付き」修飾子だけですが、すべてに適用できるわけではないと思います...クレイジーです。

13
veryxcit

スコープルールは、ループの内側からループの外側で宣言された変数にアクセスできないようにします

引用するには Peter Hollingsworth from 彼の前の答え

'cnt'にスカラーではなくオブジェクトを使用することで、この動作を無効にすることができます。

{% set cnt = [0] %}
{% for room in rooms %}
  {% for bed in room %}
    {% if cnt.append(cnt.pop() + 1) %}{% endif %} 
  {% endfor %}
{{ cnt[0] }}
{% endfor %}
total times through = {{ cnt[0] }}
16
Chris Warth

ループごとに、インデックス属性を持つループオブジェクトが生成されます。

http://jinja.pocoo.org/docs/dev/templates/#for

親ループインデックスにアクセスするには、次のようにします。 http://jinja.pocoo.org/docs/dev/tricks/#accessing-the-parent-loop

または、JinjaでPython https://docs.python.org/2/library/functions.html#enumerate と同じように機能するenumerateを使用できます。

7
Pyglouthon