web-dev-qa-db-fra.com

Comment indexez-vous sur un modèle jinja?

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

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.

19
Quentin Donnellan

Deux manières:

  1. 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>
    
  2. 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>
    
8
Sean Vieira

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>
2
Alexander