如何在 jinja 模板的 for 循环中增加一个变量?

我想做这样的事情:

变量 p 来自 test.py,它是一个列表[‘ a’,‘ b’,‘ c’,‘ d’]

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

结果如下:
1234

175365 次浏览

You could use loop.index:

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

Check the template designer documentation.

In more recent versions, due to scoping rules, the following would not work:

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

As Jeroen says there are scoping issues: if you set 'count' outside the loop, you can't modify it inside the loop.

You can defeat this behavior by using an object rather than a scalar for 'count':

{% set count = [1] %}

You can now manipulate count inside a forloop or even an %include%. Here's how I increment count (yes, it's kludgy but oh well):

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

Or...

{% set count = [] %}
{% for something-that-loops %}
{% set __ = count.append(1) %}
<div> Lorem ipsum meepzip dolor...
\{\{ count|length }}
</div>
{% endfor %}

(From comments by @eyettea and @PYB)

Came searching for Django's way of doing this and found this post. Maybe someone else need the django solution who come here.

{% for item in item_list %}
\{\{ forloop.counter }} {# starting index 1 #}
\{\{ forloop.counter0 }} {# starting index 0 #}


{# do your stuff #}
{% endfor %}

Read more here: https://docs.djangoproject.com/en/1.11/ref/templates/builtins/

Here's my solution:

Put all the counters in a dictionary:

{% set counter = {
'counter1': 0,
'counter2': 0,
'etc': 0,
} %}

Define a macro to increment them easily:

{% macro increment(dct, key, inc=1)%}
{% if dct.update({key: dct[key] + inc}) %} {% endif %}
{% endmacro %}

Now, whenever you want to increment the 'counter1' counter, just do:

\{\{ increment(counter, 'counter1') }}

I was struggle with this behavior too. I wanted to change div class in jinja based on counter. I was surprised that pythonic way did not work. Following code was reseting my counter on each iteration, so I had only red class.

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

I used loop.index like this and it works:

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

After 2.10, to solve the scope problem, you can do something like this:

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

if anyone want to add a value inside loop then you can use this its working 100%

{% set ftotal= {'total': 0} %}
{%- for pe in payment_entry -%}
{% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %}
{%- endfor -%}


\{\{ftotal.total}}

output = 5