Я бы хотел сделать что-то вроде:
переменная p взята из test.py, которая представляет собой список ['a', 'b', 'c', 'd']
{% for i in p %}
{{variable++}}
{{variable}}
результат вывод:
1 2 3 4
Вы можете использовать loop.index
:
{% for i in p %}
{{ loop.index }}
{% endfor %}
Проверьте документацию дизайнера шаблонов .
В более поздних версиях из-за правил области действия следующее не работает:
{% set count = 1 %}
{% for i in p %}
{{ count }}
{% set count = count + 1 %}
{% endfor %}
После 2.10, чтобы решить проблему с областью видимости, вы можете сделать что-то вроде этого:
{% set count = namespace(value=0) %} {% for i in p %} {{ count.value }} {% set count.value = count.value + 1 %} {% endfor %}
источник
Как говорит Йерун, существуют проблемы с областью видимости: если вы установите «count» вне цикла, вы не сможете изменить его внутри цикла.
Вы можете победить это поведение, используя объект, а не скаляр для count:
{% set count = [1] %}
Теперь вы можете управлять счетчиком внутри цикла forloop или даже% include%. Вот как я увеличиваю счетчик (да, это глупо, но да ладно):
{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
источник
{% set count = [] %}
, добавлять элемент в список в каждом цикле{% set __ = index.append(1) %}
и использовать длину для отображения индексаindex|length
.{% do index.append(1) %}
но вы должны добавить расширение, описанное здесь{% set count = [ ] %}
, добавить элемент в список в каждом цикле{% set __ = count.append(1) %}
и использовать длину для отображения счетчикаcount|length
Вот мое решение:
Поместите все счетчики в словарь:
{% 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') }}
источник
Я тоже боролся с этим поведением. Я хотел изменить класс div в jinja на основе счетчика. Я был удивлен, что питонический способ не работал. Следующий код сбрасывал мой счетчик на каждой итерации, поэтому у меня был только красный класс.
{% 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 %}
источник
если кто-то хочет добавить значение внутри цикла, вы можете использовать его на 100%
{% set ftotal= {'total': 0} %} {%- for pe in payment_entry -%} {% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %} {%- endfor -%} {{ftotal.total}}
output = 5
источник
Пришел искать способ сделать это 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/
источник