我想要做这样的事情:
变量p来自于test.py,它是一个列表['a','b','c','d']。
变量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 %}
set
。我最终通过在Django模型中定义一个函数来进行计算来解决了这个问题,正如这个答案所提到的:https://dev59.com/mlkT5IYBdhLWcg3wG70_#48158461。 - cylim正如Jeroen所说,存在作用域问题:如果在循环外设置'count',则无法在循环内修改它。
您可以通过使用对象而不是标量来解决此问题:
{% set count = [1] %}
现在你可以在for循环或者%include%中操作计数。下面是我如何增加计数的方法(是有些笨拙,但也没办法):
{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
{% set count = [] %}
{% for something-that-loops %}
{% set __ = count.append(1) %}
<div> Lorem ipsum meepzip dolor...
{{ count|length }}
</div>
{% endfor %}
(来自@eyettea和@PYB的评论)
{% set count = [] %}
,在每个循环中向列表添加一个项目 {% set __ = index.append(1) %}
,并使用长度来显示索引 index|length
。 - eyettea{% set count = [ ] %}
,在每个循环中添加一个项目 {% set __ = count.append(1) %}
,然后使用长度来显示计数 count|length
。 - PYB这是我的解决方案:
将所有计数器放入字典中:
{% 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') }}
如果任何人想在循环中添加一个值,那么可以使用以下方法,它百分之百可行:
{% set ftotal= {'total': 0} %}
{%- for pe in payment_entry -%}
{% if ftotal.update({'total': ftotal.total + 5}) %}{% endif %}
{%- endfor -%}
{{ftotal.total}}
输出结果为 5
我也曾遇到这个问题。我想在jinja中根据计数器更改div类。我很惊讶pythonic方式不起作用。以下代码在每次迭代时重置了我的计数器,所以我只有红色类。
{% 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 %}
{% 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 %}
我来搜索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/
为了更好地解决这个问题。 Jinja2变量的行为与传统脚本语言不同,您无法在for循环中修改变量。因此,为了绕过这种行为,您可以使用字典,因为您可以更改字典的值。
**{% set margin={"margin_value":0} %}**
{% for lang in language %}
<ul>
<li style="margin-right: {{ margin.margin_value}}px">{{ lang }}</li>
</ul>
**{% if margin.update({"margin_value":margin.margin_value + 2}) %}
{% endif %}**
{% endfor %}
loop.index
从1开始而不是0。 - Jabbaloop.index
从1开始而不是0。 - undefined