Djangoのテンプレートでカスタムフィルタを使う

例えばリストをループで複数行書き出す時とかは、奇数行と偶数行で背景の色を分けたかったりします。でも、Django標準だとそんなことできないっぽいんですよね。

ので、カスタムフィルタを使って実装してみました。

  1. アプリケーションディレクトリ(models.pyとかviews.pyが置いてあるトコ)に「templatetags」というフォルダを作成。
  2. そのフォルダの中に「__init__.py」と「hoge.py」を作成。「__init__.py」は白紙。
  3. 「hoge.py」に以下を記述
    from django import template
    register = template.Library()
    @register.filter(name=’getOddEven’)
    def getOddEven(_val):
        if _val % 2==0:
            return ‘even’
        else:
            return ‘odd’
  4. テンプレートファイル側に{% load hoge %}と記述。
  5. テンプレートのループの中で「{{ forloop.counter|getOddEven }}」と記述すると「odd/even」の文字列が返ってくる。

フィルタの使い方としては、「値|フィルタ」といういつもの書き方とおんなじです。

「forloop.counter」というのはテンプレート内でfor文を使ったときに内部で持っている値です。サンプルを見るとわかりやすいかな。

{% for item in list %}
{{ forloop.counter }},
{% endfor %}

これで、1,2,3,,,,と表示されます。1から始まる序数ですね。「django/template/defaulttags.py」を見ていただくと、他にもいろいろな値を持っています。これは便利。

で、あとはその序数をカスタムフィルタに渡してあげればOKということです。

{% load hoge %}
{% for item in list %}
<p class=”{{ forloop.counter| getOddEven}}”>{{ item }}</p>
{% endfor %}

恐るべしDjango、使いこなすまでの道のりは長い。。。