获取Jinja for循环中的当前值和下一个值

时间:2016-07-21 16:38:32

标签: python flask jinja2

有没有办法迭代Jinja2中可以在一次迭代中访问第n和第(n + 1)个元素的列表?

{% for x in my_list %}

<!-- print the current and the (current+1) -->
{{x}}, {{x+1}} <-- this is wrong but hopefully highlights the problem

{% endfor %}

此外,for循环是否允许“步进”增量?

3 个答案:

答案 0 :(得分:1)

Jinja有一个loop.index变量,可用于访问列表中的下一个值:

@app.route('/')
def index():
    return render_template_string("""
        <body>
            {% for x in my_list %}
                <p>
                    {{ x }} {{ my_list[loop.index] }}<br>
                </p>
            {% endfor %}
        </body>
    """, my_list=range(10))
  

0 1

     

1 2

     

2 3

     

3 4

     

4 5

     

5 6

     

6 7

     

7 8

     

8 9

     

9

答案 1 :(得分:0)

Jinja v2.10开始,我们可以使用loop.nextitem代替my_list[loop.index]技巧。同样,loop.previtem也可用。 :-)

从上面的超链接变更日志中:

在循环上下文中添加了previtemnextitem,从而可以访问循环中的上一个/下一个项目。如果此类项目不存在,则该值是不确定的。

答案 2 :(得分:0)

也许使用loop.nextitem的示例会有所帮助。

我正在监视的值在行列表的第一列中。

尝试这样的事情:

{% for row in mylist %}
    {% if row.rowtype == "Selection" %}
        {% if loop.changed(row.rowid) %}
            <br/>{{ row.rowprompt }}:
            <select name="{{ row.rowname }}" id="{{ row.rowname }}">
            <option value="{{ row.rowvalue }}">{{ row.rowvalue }}</option>
             {% set isSelectStart = 1 %}
        {% else %}
                <option value="{{ row.rowvalue }}">{{ row.rowvalue }}</option>
        {% endif %}
        {% if loop.nextitem is defined and row.rowid != loop.nextitem[0] %}
                    </select>
        {% endif %}
        {% if loop.nextitem is not defined %}
                    </select>
        {% endif %}
    {% endif %}
{% endfor %}