読者です 読者をやめる 読者になる 読者になる

Jinja2 で for ループのインデックスを取得する方法

リストに詰めたデータを、Jinja2 を使って 5列×n行*1 のテーブルで出力しなければいけなくなりました。


インデックス付きループを使って「横に5個出力したら次の行へ」という処理を書けばいいんですが、インデックス付きループに必要な enumerate が Jinja2 では使えません。なんてこったい/(^o^)\


代わりと言ってはなんですが、Jinja2 では loop っていう特殊なオブジェクトが提供されていました。

loop.index0 または loop.index で、インデックスを取得できます。ちなみに、index0 は0から開始、index は1から開始したときのインデックスです。


loop.index0 を使って 5列×n行のテーブルを出力するサンプルがこちら。

<table>
    <tbody>
        <tr>
            {% for item in item_list %}
            <td>
                {{ item.name }}
            </td>

            <!--5列出力したら次の行へ-->
            <!--インデックスは loop オブジェクトから取得-->
            {% if loop.index0 % 5 == 4 %}
        </tr>
        <tr>
            {% endif %}

            {% endfor %}
        </tr>
    </tbody>
</table>

上記の場合、5列ぴったりで終わるとき、余計な tr タグが出力されてしまいます。でも今回はコードの読みやすさを重視し、あえて無視。

*1:行数はリストの長さで変わる