jinjaテンプレートのforループで変数をインクリメントする方法は?


83

私は次のようなことをしたいと思います:

変数pは、リスト['a'、 'b'、 'c'、 'd']であるtest.pyからのものです。

{% for i in p %}
{{variable++}}
{{variable}}

結果の出力は次のとおりです
。1234

回答:


157

あなたが使用することができますloop.index

{% for i in p %}
  {{ loop.index }}
{% endfor %}

テンプレートデザイナのドキュメントを確認してください。

最近のバージョンでは、スコープ規則により、以下は機能しませんでした

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}

この回答を使用し、スコープの問題を解決します
faruk13 2010

68

2.10以降、スコープの問題を解決するには、次のようにします。

{% set count = namespace(value=0) %}
{% for i in p %}
  {{ count.value }}
  {% set count.value = count.value + 1 %}
{% endfor %}

1
次のエラーが発生します:TemplateSyntaxError at / Listing /無効なブロックタグ(145行目): 'set'、expected'endblock '。このタグを登録またはロードするのを忘れましたか?オン:{%set count = namespace(value = 0)%}これの原因について何か考えはありますか?
アンドリュー

56

Jeroenが言うように、スコープの問題があります。ループの外側で「count」を設定すると、ループの内側で変更することはできません。

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

{% set count = [1] %}

forloopまたは%include%内でカウントを操作できるようになりました。これが私がカウントをインクリメントする方法です(はい、それは厄介ですがまあまあです):

{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}

ピーターホリングスワース。その情報をどうもありがとう、私を大いに助けてくれました。
mthecreator 2016

6
少しすっきりしたimoのもう1つの解決策は、空のリストを初期化し、{% set count = [] %}すべてのループでリストに項目を追加し、{% set __ = index.append(1) %}その長さを使用してインデックスを表示することindex|lengthです。
eyettea 2017

1
また、次のようなdoステートメントを使用でき{% do index.append(1) %} ますが、ここで
AstraSerg 2017年

2
@eyetteaのきれいなソリューションを修正:ビットクリーナーだ別の解決策は、芋空のリストを初期化することで{% set count = [ ] %}、すべてのループ内のリストに項目を追加{% set __ = count.append(1) %}し、カウントを表示するために長さを使用するcount|length
PYB

14

これが私の解決策です:

すべてのカウンターを辞書に入れます。

{% set counter = {
    'counter1': 0,
    'counter2': 0,
    'etc': 0,
    } %}

それらを簡単にインクリメントするマクロを定義します。

{% macro increment(dct, key, inc=1)%}
    {% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}

これで、「counter1」カウンターをインクリメントするときはいつでも、次のようにします。

{{ increment(counter, 'counter1') }}

厄介な問題に対するエレガントなソリューション。ありがとうございました!
SevakPrime 2018

とても良い!ネストされた2つのforループにまたがる累積カウントインデックスが必要でした。これは、そのユースケースに最適です。
jxramos

2

私もこの行動に苦労しました。カウンターに基づいてジンジャのdivクラスを変更したかった。pythonicの方法が機能しないことに驚いた。次のコードは、反復ごとにカウンターをリセットしていたため、赤いクラスしかありませんでした。

{% if sloupec3: %}
    {% set counter = 1 %}
    {% for row in sloupec3: %}
        {% if counter == 3 %}
            {% set counter = 1 %}        
        {% endif %} 

        {% if  counter == 1: %}
           <div class="red"> some red div </div>
        {% endif %} 

        {% if counter == 2: %}
           <div class="gray"> some gray div </div>
        {% endif %} 

        {% set counter = counter + 1 %} 

    {% endfor %}

{% endif %}

私はこのようにloop.indexを使用しました、そしてそれは働きます:

{% if sloupec3: %}

    {% for row in sloupec3: %} 

        {% if  loop.index % 2 == 1: %}
           <div class="red"> some red div </div>
        {% endif %} 

        {% if loop.index % 2 == 0: %}
           <div class="gray"> some gray div </div>
        {% endif %}  

    {% endfor %}

{% endif %}

1

誰かがループ内に値を追加したい場合は、これを100%使用できます

{% set ftotal= {'total': 0} %} 
{%- for pe in payment_entry -%}
    {% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %} 
{%- endfor -%}

{{ftotal.total}}

出力= 5


0

Djangoのこれを行う方法を探しに来て、この投稿を見つけました。たぶん誰か他の人がここに来るジャンゴソリューションを必要としています。

{% for item in item_list %}
    {{ forloop.counter }} {# starting index 1 #}
    {{ forloop.counter0 }} {# starting index 0 #}

    {# do your stuff #}
{% endfor %}

詳細はこちら:https//docs.djangoproject.com/en/1.11/ref/templates/builtins/


2
それがDjangoテンプレートエンジンです。OPはjinja2を要求しました
Jahid 2017

助けてくれてありがとう!
Zohab Ali 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.