如何在Jinja模板中的for循环上增加变量?


83

我想做类似的事情:

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

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

结果输出是:
1 2 3 4

Answers:


157

您可以使用loop.index

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

检查模板设计器文档

在最近的版本中,由于作用域规则,下面的工作:

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

使用答案解决范围界定问题
faruk13 '20

68

2.10之后,要解决范围问题,您可以执行以下操作:

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

1
我在/ listing /第145行上的无效块标记处收到错误:TemplateSyntaxError:“设置”,预期为“ endblock”。您是否忘记注册或加载此标签?开:{%set count = namespace(value = 0)%}是否知道原因?
安德鲁

56

正如Jeroen所说,存在范围界定问题:如果在循环外部设置“计数”,则无法在循环内部进行修改。

您可以通过使用对象而不是“ count”的标量来消除这种行为:

{% set count = [1] %}

现在,您可以在forloop甚至%include%中操纵计数。这是我增加计数的方式(是的,这很麻烦但是很好):

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

彼得·霍林斯沃思(Peter Hollingsworth)。非常感谢您提供的信息,对我有很大帮助。
mthecreator

6
另一个更干净的imo解决方案是初始化一个空列表{% set count = [] %},在每个循环中将一个项目添加到列表中,{% set __ = index.append(1) %}并使用长度显示索引index|length
eyettea

1
同样,您可以使用do语句,{% do index.append(1) %} 但是您必须添加此处
AstraSerg

2
纠正@eyettea的干净解决方案:另一个更干净的imo解决方案是:初始化一个空列表{% 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类。令我惊讶的是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 %}

我像这样使用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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.