Как увеличить переменную в цикле for в шаблоне jinja? - PullRequest
64 голосов
/ 24 сентября 2011

Я хотел бы сделать что-то вроде:

переменная p взята из test.py, который является списком ['a', 'b', 'c', 'd']

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

результат вывода: 1 2 3 4

Ответы [ 6 ]

122 голосов
/ 24 сентября 2011

Вы можете использовать loop.index:

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

Проверьте документацию дизайнера шаблонов .

В более поздних версиях, из-за правил области видимости, следующее будет не работа:

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}
48 голосов
/ 21 сентября 2015

Как говорит Джерун, существуют проблемы с областями видимости: если вы установите 'count' вне цикла, вы не сможете изменить его внутри цикла.

Вы можете победить это поведение, используя объект вместо скаляра для 'count':

{% set count = [1] %}

Теперь вы можете манипулировать счетом в цикле или даже% include%.Вот как я увеличиваю счетчик (да, это глупо, ну да ладно):

{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
22 голосов
/ 06 апреля 2018

После 2.10, чтобы решить проблему с областью действия, вы можете сделать что-то вроде этого:

{% set count = namespace(a=0) %}
{% for i in p %}
  {{ count.a }}
  {% set count.a = count.a + 1 %}
{% endfor %}
13 голосов
/ 11 августа 2017

Вот мое решение:

Поместите все счетчики в словарь:

{% 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') }}
1 голос
/ 20 февраля 2018

Я тоже боролся с этим поведением.Я хотел изменить класс 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 %}
1 голос
/ 24 июля 2017

Пришел в поисках 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...