web-dev-qa-db-ja.com

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

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

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

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

結果出力:1 2 3 4

64
user422100

loop.indexを使用できます:

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

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

より新しいバージョンでは、スコーピングルールにより、次のように動作しますnot

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

Jeroenがスコープの問題があると言っているように:ループの外側で 'count'を設定すると、ループの内側でそれを変更することはできません。

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

{% set count = [1] %}

Forloopまたは%include%内でカウントを操作できるようになりました。カウントをインクリメントする方法は次のとおりです(はい、それは気味悪いですが、まあ)

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

2.10以降、スコープの問題を解決するには、次のようなことができます。

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

ここに私の解決策があります:

辞書にすべてのカウンターを入れてください:

{% 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') }}
13
Jahid

これを行うDjangoの方法を探しに来て、この投稿を見つけました。たぶん他の誰かがここに来る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/

1
Tuxedo Joe

私もこの行動に苦労しました。カウンターに基づいて神社の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
Nikix