Jinja 템플릿의 for 루프에서 변수를 증가시키는 방법은 무엇입니까?


83

다음과 같이하고 싶습니다.

변수 p는 목록 [ 'a', 'b', 'c', 'd'] 인 test.py에서 가져온 것입니다.

{% 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 %}

답변을 사용 하여 범위 지정 문제를 해결하십시오.
faruk13

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 / Invalid block tag on line 145 : 'set', expected 'endblock'. 이 태그를 등록하거나로드하는 것을 잊으셨습니까? 켜짐 : {% set count = namespace (value = 0) %} 원인이 무엇인지 아십니까?
Andrew

56

Jeroen은 범위 지정 문제가 있다고 말했듯이 루프 외부에서 'count'를 설정하면 루프 내부에서 수정할 수 없습니다.

'count'에 스칼라가 아닌 객체를 사용하여이 동작을 무효화 할 수 있습니다.

{% set count = [1] %}

이제 forloop 또는 % include % 내에서 count를 조작 할 수 있습니다. 카운트를 늘리는 방법은 다음과 같습니다 (예, 엉성하지만 오 잘).

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

피터 홀 링스 워스. 그 정보를 주셔서 감사합니다.
mthecreator

6
조금 더 깔끔한 또 다른 해결책은 빈 목록을 초기화하고 {% set count = [] %}모든 루프의 목록에 항목을 추가 {% set __ = index.append(1) %}하고 길이를 사용하여 색인을 표시하는 것입니다 index|length.
eyettea

1
또한, 당신은 사용할 수 있습니다 할 일 이 같은 문을 {% do index.append(1) %} 하지만 당신은 확장자 설명 추가 할 필요가 여기에
AstraSerg

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

아주 좋아요! 두 개의 중첩 된 for 루프에 걸쳐 롤링되는 누적 계수 인덱스가 필요했습니다. 이는 해당 사용 사례에 적합합니다.
jxramos

2

저도이 행동으로 고생했습니다. 카운터를 기반으로 jinja에서 div 클래스를 변경하고 싶었습니다. 비단뱀 방식이 작동하지 않는다는 사실에 놀랐습니다. 다음 코드는 각 반복에서 카운터를 재설정했기 때문에 빨간색 클래스 만있었습니다.

{% 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의 방법을 찾고이 게시물을 찾았습니다. 아마도 다른 누군가가 여기에 오는 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
즉 장고 템플릿 엔진, 영업 이익은 jinja2에 대한 질문입니다
Jahid

도와 주셔서 감사합니다!
Zohab Ali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.