如何在jinja模板中为for循环增加变量?

use*_*100 66 python jinja2

我想做的事情如下:

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

{% for i in p %}
{{variable++}}
{{variable}}
Run Code Online (Sandbox Code Playgroud)

结果输出为:1 2 3 4

zee*_*kay 129

您可以使用loop.index递增计数器:

{% for i in p %}
  {{ loop.index }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用loop.index:

{% set count = 1 %}
{% for i in p %}
  {{ count }}
  {% set count = count + 1 %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

检查模板设计器文档.

  • 使用第二个列表,由于Jinja中的范围规则,第一个列表将不起作用 (48认同)
  • 使用[此](/sf/answers/3478971261/)答案来解决范围界定问题 (7认同)
  • @zeekay,请按照评论中的建议更新您的答案 (5认同)

Pet*_*rth 50

正如Jeroen所说,存在范围问题:如果在循环外设置'count',则无法在循环内修改它.

你可以通过使用对象而不是'count'的标量来打败这种行为:

{% set count = [1] %}
Run Code Online (Sandbox Code Playgroud)

您现在可以在forloop内部操作count,甚至可以操作%include%.这是我如何增加计数(是的,它是kludgy但很好):

{% if count.append(count.pop() + 1) %}{% endif %} {# increment count by 1 #}
Run Code Online (Sandbox Code Playgroud)

  • 另一个更清洁的解决方案是初始化一个空列表`{%set count = []%}`,在每个循环`{%set __ = index.append(1)%}`中添加一个项目到列表中使用长度来显示索引`index | length`. (5认同)
  • 纠正@eyettea的干净解决方案:另一个更干净的imo解决方案是初始化一个空列表`{%set count = []%}`,并在每个循环`{%set __ = count'中向列表添加一个项目。 append(1)%}`并使用长度显示计数`count | length` (2认同)

Pat*_*ira 27

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

{% set count = namespace(value=0) %}
{% for i in p %}
  {{ count.value }}
  {% set count.value = count.value + 1 %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

Jah*_*hid 13

这是我的解决方案:

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

{% set counter = {
    'counter1': 0,
    'counter2': 0,
    'etc': 0,
    } %}
Run Code Online (Sandbox Code Playgroud)

定义一个宏来轻松增加它们:

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

现在,只要你想增加'counter1'计数器,就这样做:

{{ increment(counter, 'counter1') }}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

{{ftotal.total}}
Run Code Online (Sandbox Code Playgroud)

输出 = 5