web-dev-qa-db-ja.com

Jinjaテンプレートでどのようにインデックスを作成しますか?

3つのリストを私のpythonファイルを通じて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}}
18
user986173

本当にインデックスが必要な場合は、変数の1つをループして、Jinjaのloop.index0機能を使用できます(0から始まるループの現在のインデックスを返します(loop.indexは、 1)

例えば:

{% for item in list1 %}

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

{% endfor %}

これは、テンプレートを設定する前に、リストがすべて同じ長さであるとアサートされていることを前提としています。そうでないと、問題が発生します。

19

二通り:

  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 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>
    
8
Sean Vieira

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