Як збільшити змінну у циклі for у шаблоні jinja?


83

Я хотів би зробити щось на зразок:

змінна p - з test.py, що є списком ['a', 'b', 'c', 'd']

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

результат виведення:
1 2 3 4

Відповіді:


157

Ви можете використовувати loop.index:

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

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

У більш пізніх версіях через правила масштабування наступне не буде працювати:

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

Використовуйте цю відповідь для вирішення питання про
масштаб

68

Після 2.10, щоб вирішити проблему масштабу, ви можете зробити щось подібне:

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

1
Я отримую помилку: TemplateSyntaxError на / listing / Недійсний тег блоку в рядку 145: 'set', очікується 'endblock'. Ви забули зареєструвати або завантажити цей тег? Увімкнено: {% set count = space names (value = 0)%} Будь-яке уявлення про причину цього?
Ендрю

56

Як каже Джерун, є проблеми з обсягом: якщо ви встановите "count" поза циклом, ви не зможете змінити його всередині циклу.

Ви можете перемогти цю поведінку, використовуючи об'єкт, а не скаляр для "count":

{% set count = [1] %}

Тепер ви можете маніпулювати підрахунком усередині цикла або навіть% включити%. Ось як я збільшую підрахунок (так, це студійно, але добре):

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

Пітер Холлінгсворт. Велике спасибі за цю інформацію, мені дуже допомогло.
mthecreator

6
Іншим рішенням, яке трохи чистіше imo, є ініціалізація порожнього списку {% set count = [] %}, додавання елемента до списку в кожному циклі {% set __ = index.append(1) %}та використання довжини для відображення індексу index|length.
eyettea

1
Крім того, ви можете використовувати оператор do, подібний цьому, {% do index.append(1) %} але ви повинні додати розширення, описане тут
AstraSerg

2
Виправлення @eyettea «S чистого рішення: Інше рішення , яке трохи чистіше ІМО повинні ініціалізувати порожній список {% 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

Дуже добре! Мені потрібен сукупний індекс підрахунку, який котиться по двох вкладених циклах. Це чудово підходить для цього випадку використання.
jxramos

2

Я теж боровся з цією поведінкою. Я хотів змінити клас 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

якщо хтось хоче додати значення всередині циклу, тоді ви можете використовувати це його робоче 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 Template Engine, OP попросив jinja2
Джахід

Дякую, що мені допомогло!
Зохаб Алі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.