如何在jinja模板中进行索引?

34
我通过Python文件将3个列表传递到Jinja模板中。
list1 = [1,2,3,4]
list2 = ['a','b','c','d']
list3 = [5,6,7,8]

所有这些值都相互对应,因此1与'a'和5匹配,2与'b'和6匹配,依此类推。

在我的模板中,我将它们打印在同一行上。如何进行数字索引以将它们打印出来? 像这样

1 a 5
2 b 6
3 c 7

我知道的唯一方法是通过循环直接访问对象,例如:

 {%for item in list%}
    {{item}}

使用 { % for i, item enumerate(l) % } - Grijesh Chauhan
1
在视图中,您可以执行 zip(list1, list2, list3) 然后循环遍历它们。 - karthikr
3
@GrijeshChauhan 我认为你无法在jina2中使用enumerate。我得到了错误,说它没有定义。 - bernie2436
1
@bernie2436,我评论的代码在for语法中缺少in,正确的写法应该是{ % for i, item in enumerate(l) % }。但我不了解Jina。 - Grijesh Chauhan
在Jinja中,enumerate函数无法正常工作。 - undefined
4个回答

47

如果你真的想要索引,你可以只循环其中一个变量,然后使用Jinja的loop.index0特性(返回循环当前的索引,从0开始计数,loop.index也是同样的功能,但从1开始计数)

例如:

{% for item in list1 %}

    {{ item }}
    {{ list2[loop.index0] }}
    {{ list3[loop.index0] }}

{% endfor %}

这假定在设置模板之前已经断言你的所有列表长度相同,否则会遇到问题。


1
循环中loop.index0和loop.index的区别帮助了我。 - Barbz_YHOOL

10

两种方法:

  1. 在调用Jinja的代码中,只需将您的列表打包zip

    data = zip(list1, list2, list3)
    # data is now a list of tuples
    # [(1, 'a', 5), (2, 'b', 6), etc.]
    

    然后,在您的模板中,您可以简单地循环嵌套的行:

    {# your_template.jinja #}
    <table>
    {% for row in data %}
        <tr>
        {% for cell in row %}
            <td>{{ cell }}</td>
        {% endfor %}
        </tr>
    {% endfor %}
    </table>
    
  2. 作为替代方案,如果您只想使用Jinja,则可以使用特殊的loop变量

  3. <table>
    {% for cell in list1 %}
        <tr>
            <td>{{ list1[loop.index0] }}</td>
            <td>{{ list2[loop.index0] }}</td>
            <td>{{ list3[loop.index0] }}</td>
        </tr>
    {% endfor %}
    </table>
    

4
与@Sean Vieira的答案类似,您可以在代码中压缩数据,然后在模板中对其进行索引。例如: data = zip(list1, list2, list3)
<table>
<tr>
       <td>list 1 value</td>
       <td>list 2 value</td>
       <td>list 3 value</td>        
<tr>
{% for row in data %}
<tr>
       <td>{{ row[0] }}</td>
       <td>{{ row[1] }}</td>
       <td>{{ row[2] }}</td>
</tr>
{% endfor %}
</table>

2

虽然不能直接进行列表索引操作,但可以通过间接方式实现。

首先将您的列表转换为字符串,然后将其传递到您的jinja模板中。

其次,在jinja模板中通过拆分操作将该字符串拆分成集合(类似于列表嵌套列表)。

最后,您就可以像在Python列表中一样简单地进行索引操作。

{% set list1 = variable1.split(',') %}
The grass is {{ list1[0] }} and the boat is {{ list1[1] }}

或者

{% set list1 = variable1.split(',') %}
{% for item in list1 %}
    <p>{{ item }}<p/>
{% endfor %} 

或者

{% set item1, item2 = variable1.split(',') %}
The grass is {{ item1 }} and the boat is {{ item2 }}

为什么元组的分隔符是“,”,而分割字符却是“;”? - Fred Zimmerman
1
哦!我忘记改了。谢谢你注意到这个。 - Dhruv Arne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接