1月 19
このエントリをはてなブックマークに登録 Yahoo!ブックマークに登録

例えばリストをループで複数行書き出す時とかは、奇数行と偶数行で背景の色を分けたかったりします。でも、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、使いこなすまでの道のりは長い。。。

関連性のあるエントリ:

  1. XSLTを使ってXMLをCSVに変換する
  2. PHPとRubyとPythonのパフォーマンスを比較してみました
  3. PythonでDjangoを使ったバッチ処理
  4. Djangoで集計クエリ(1.1以降でannotateを使用)
  5. Djangoでファイルをダウンロードさせる方法

Leave a Reply

Get Adobe Flash playerPlugin by wpburn.com wordpress themes
preload preload preload