2017-10-25 3 views
0

ネストされたforループカウントの更新に関するヘルプが必要です。Jinjaのネストされたforループのカウントを更新する

{% for house in city %} 
{% set count = 0 %} 
    <div>{{ house.address }} has {{ count }} beds in it rooms.</div> 
    {% for room in house %} 
    {% if room.has_bed == True %}{% set count = count + 1 %}{% endif %} 
    {% endfor %} 
{% endfor %} 

私の目標は、forループの内側に家でベッドの合計数を取得し、ループの外で数を更新し、次のために0に戻ってカウントをリセットすることです。これは私のコードです家。 これまでカウントを更新しているわけではありません。ちょうど0と書かれています。 \ 何か助けていただければ幸いです。

答えて

2

これは​​とスコープの動作であり、かつcountのインクリメント値はループの範囲内で生活しています。それらの例は変数を設定することを含みますが、コンセプトはまだ同じです

ブロック内に変数を設定してそれらを外部に表示することはできません。これはループにも当てはまります。そのルールの唯一の例外は、スコープを導入しないif文です。その結果、以下のテンプレートは、あなたが期待するかもしれない何をするつもりはない。

{% set iterated = false %} 
{% for item in seq %} 
    {{ item }} 
    {% set iterated = true %} 
{% endfor %} 
{% if not iterated %} did not iterate {% endif %} 

それはあなたがハックっぽい回避策を実行する必要があります。この

を行うには神社の構文では不可能ですcountを表示するには

{% for house in city %} 
    {% set room_count = [] %} 
    {% for room in house %} 
     {% if room.has_bed == True %}{% if room_count.append(1) %}{%- endif -%}{% endif %} 
    {% endfor %} 
    <div>{{ house.address }} has {{ room_count|length }} beds in it rooms.</div> 
{%- endfor -%} 
+0

Jinja 2.10がリリースされると、この種の「名前空間」ソリューションが組み込まれます。これは 'if append'ハックの代わりに' set'が理解する名前空間オブジェクトを使います。 – davidism

+0

@davidism Nice!そのことを知らせてくれてありがとう – Wondercricket

+0

ありがとう@Wondercricketは魅力的に働いた – aharding378

0

EDIT:これは神社2.82で私の経験に基づいていた、そしてそれは、出力を取得した後、その後、カウントが計算されるよう

が私に見える(コメントを参照してください)神社2.9でのスコープの変更後に動作しません。次のループのためにリセットされます(これがあなたに0を見せ続ける理由です)。これを試してみてください:

{% for house in city %} 
    {% set count = 0 %} 
    {% for room in house %} 
     {% if room.has_bed == True %}{% set count = count + 1 %}{% endif %} 
    {% endfor %} 
    <div>{{ house.address }} has {{ count }} beds in it rooms.</div> 
{% endfor %} 
+1

これは新しい範囲指定規則のためにJinja 2.9+では機能しません。 (これは、最初はうまくいきませんでしたが、偶然でした) – davidism

+0

私はそれに気づいていませんでしたが、私の最新のJinjaプロジェクトはまだ2.9にアップグレードされていませんでした。ヘッドアップをありがとう! – ividito

関連する問題