例えばリストをループで複数行書き出す時とかは、奇数行と偶数行で背景の色を分けたかったりします。でも、Django標準だとそんなことできないっぽいんですよね。
ので、カスタムフィルタを使って実装してみました。
- アプリケーションディレクトリ(models.pyとかviews.pyが置いてあるトコ)に「templatetags」というフォルダを作成。
- そのフォルダの中に「__init__.py」と「hoge.py」を作成。「__init__.py」は白紙。
- 「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’ - テンプレートファイル側に{% load hoge %}と記述。
- テンプレートのループの中で「{{ 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、使いこなすまでの道のりは長い。。。