Как вы индексируете шаблон jinja?

Я передаю 3 списка в мой шаблон jinja через мой файл python.

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}}

Ответ 1

Если вам действительно нужен индекс, вы можете просто зациклиться на одной из переменных, а затем использовать функцию Jinja loop.index0 (возвращает текущий индекс цикла, начинающийся с 0 (loop.index делает то же самое, начиная с 1 )

Например:

{% for item in list1 %}

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

{% endfor %}

Это предполагает, что все ваши списки утверждены как одна длина до установки шаблона, или вы столкнетесь с проблемами.

Ответ 2

Два способа:

  • В коде, который вызывает 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>
    
  • В качестве альтернативы, если вы хотите использовать Jinja, вы можете использовать специальную переменную loop:

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

Ответ 3

Как и в ответ @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>