[Django] テンプレート内でお手軽にrange関数を利用する

Djangoテンプレートを書いているとテンプレート内でrange関数が使いたくなることがよくあります。
そんな時にお手軽にrange関数っぽいことができるようになる小技のご紹介。

rangeもどき

特定の回数ループを回したい。
そんな時には以下の方法を利用すると余計な箇所に変更を加えることなく簡単にrange関数っぽく利用できます。

{% with ''|center:n as range %}
{% for _ in range %}
    <p>繰り返しの要素</p>
{% endfor %}
{% endwith %}

n部分に繰り返したい回数を指定します。

やっている事としては、

  1. 空文字列('')をcenterフィルターに通して引数(n)で指定した数の半角空白文字列にする。
  2. with節で 1. で作った半角空白文字列を一時的に変数rangeとして定義。
  3. rangeforの対象としてループを回す。

一応、with節を使わずとも

{% for _ in ''|center:n %}
    <p>繰り返しの要素</p>
{% endfor %}

のように書けますが、後からテンプレートを見直した時に何をしているのか分かりづらくなるのでwith節を利用することをお勧めします。

ループの回数を取得したい

ループの回数を取得したい場合はforloop.counterを利用すると楽ちんです。

{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter }}
{% endfor %}
{% endwith %}

0から値を取得したい場合はforloop.counter0が利用できます。

{% with ''|center:n as range %}
{% for _ in range %}
    {{ forloop.counter0 }}
{% endfor %}
{% endwith %}

最後に

ここで紹介したのは超お手軽に利用する方法なのでテンプレートの各所でrange関数を利用したい場合は、素直にcontext_processorsを利用するなり、カスタムテンプレートタグを作るなりしましょう。

ライブラリの導入に抵抗がなければ、

[Django] テンプレートでzip,rangeなどのPythonの組み込み関数を利用する

こんなのもあるので良ければどうぞ。