Je passe 3 listes à mon modèle jinja via mon fichier python.
list1 = [1,2,3,4]
list2 = ['a','b','c','d']
list3 = [5,6,7,8]
Toutes ces valeurs correspondent les unes aux autres, donc 1 correspond à "a" et 5, 2 à "b" et 6, etc.
Dans mon modèle, je les imprime sur la même ligne. Comment faire l'indexation numérique pour les imprimer? Comme tel
1 a 5
2 b 6
3 c 7
La seule chose que je sais est d'accéder directement à l'objet à travers la boucle comme
{%for item in list%}
{{item}}
Si vous voulez vraiment l'index, vous pouvez simplement boucler sur l'une des variables, puis utiliser la fonction loop.index0
De Jinja (retourne l'index actuel de la boucle à partir de 0 (loop.index
Fait la même chose, à partir de 1)
Par exemple:
{% for item in list1 %}
{{ item }}
{{ list2[loop.index0] }}
{{ list3[loop.index0] }}
{% endfor %}
Cela suppose que vos listes ont toutes la même longueur avant de définir le modèle, sinon vous rencontrerez des problèmes.
Deux manières:
Dans votre code qui appelle Jinja simplement Zip
vos listes:
data = Zip(list1, list2, list3)
# data is now a list of tuples
# [(1, 'a', 5), (2, 'b', 6), etc.]
Ensuite, dans votre modèle, vous pouvez simplement parcourir les lignes imbriquées:
{# your_template.jinja #}
<table>
{% for row in data %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
Comme alternative, si vous ne souhaitez utiliser que Jinja, vous pouvez utiliser la variable spéciale 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>
Semblable à la réponse @Sean Vieira, vous pouvez compresser les données dans votre code, puis les indexer dans le modèle. Par exemple:
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>