【问题标题】:How to increment a variable on a for loop in jinja template?如何在 jinja 模板的 for 循环中增加变量?
【发布时间】:2011-11-24 03:29:07
【问题描述】:

我想做这样的事情:

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

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

结果输出为:
1 2 3 4

【问题讨论】:

    标签: python jinja2


    【解决方案1】:

    你可以使用loop.index:

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

    检查template designer documentation

    在较新的版本中,由于范围规则,以下内容将起作用:

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

    【讨论】:

    • 使用this 回答来解决范围问题
    【解决方案2】:

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

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

    {% set count = [1] %}
    

    您现在可以在 forloop 甚至 %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 的 cmets)

    【讨论】:

    • 彼得霍林斯沃思。非常感谢您提供的信息,对我帮助很大。
    • 另一个更简洁的 imo 解决方案是初始化一个空列表{% set count = [] %},在每个循环中向列表中添加一个项目{% set __ = index.append(1) %},并使用长度来显示索引index|length
    • 另外,你可以使用do这样的声明{% do index.append(1) %}但是你必须添加描述here的扩展
    • 更正@eyettea 的干净解决方案:另一个更干净的解决方案是 imo 初始化一个空列表 {% set count = [ ] %},在每个循环中添加一个项目到列表 {% set __ = count.append(1) %} 并使用长度显示计数count|length
    【解决方案3】:

    来搜索 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/

    【讨论】:

    • 那是 Django 模板引擎,OP 要求 jinja2
    • 感谢您对我的帮助!
    【解决方案4】:

    这是我的解决方案:

    将所有计数器放入字典中:

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

    【讨论】:

    • 优雅的解决方案。谢谢!
    • 非常好!我需要一个在两个嵌套 for 循环中滚动的累积计数索引。这非常适合该用例。
    【解决方案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 %}
    

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

    【讨论】:

      【解决方案6】:

      2.10之后,为了解决范围问题,可以这样做:

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

      【讨论】:

      • 我收到错误:TemplateSyntaxError at /listing/ 第 145 行的块标记无效:'set',预期为 'endblock'。您是否忘记注册或加载此标签? On: {% set count = namespace(value=0) %} 知道造成这种情况的原因吗?
      【解决方案7】:

      如果有人想在循环中添加一个值,那么你可以使用它 100% 工作

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

      输出 = 5

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-14
        • 2020-05-11
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        • 2013-11-25
        • 2011-02-24
        相关资源
        最近更新 更多