你如何索引jinja模板?

时间:2013-11-27 04:08:57

标签: python jinja2

我通过我的python文件将3个列表传递给我的jinja模板。

list1 = [1,2,3,4]
list2 = ['a','b','c','d']
list3 = [5,6,7,8]

所有这些值都是相互对应的,所以1匹配'a',5匹配'b'和6等等。

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

1 a 5
2 b 6
3 c 7

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

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

4 个答案:

答案 0 :(得分:18)

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

例如:

{% for item in list1 %}

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

{% endfor %}

这假设您的列表在设置模板之前都被声明为相同的长度,或者您将遇到问题。

答案 1 :(得分:8)

两种方式:

  1. 在您的代码中,只需zip您的列表即可调用Jinja:

    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 variable

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

答案 2 :(得分:1)

与@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>

答案 3 :(得分:1)

不是直接而是间接你可以做列表索引

首先将您的列表转换为字符串,然后传入您的 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 }}