【Django】テンプレートフィルタを自作する!
はじめに
DjangoでWEBサービスをガリガリ開発しています。
開発している中で、
views.pyから画面に渡されたリストデータを
インデックス指定して値を取得したい事態になりました。
予め用意してあるDjangoのテンプレートフィルタの中に、
リストデータからインデックス指定して値を取得する機能はありません。
そこで、今回以下のサイトを参考に、
テンプレートフィルタを自作しました。
完成ソース
リストAとBがあった際に、
Aをループで回しながらBの値を取得する処理です。
#インデックスオーバーになったらどうすの?とか辞書型を使えば?とかは置いておいてください...
「index」というテンプレートを読み込んでインデックスを指定してリストBから取得します。
{% load index %} {% for val in A %} <tr class="even"> <td>{{ val }}</td> <td>{{ B|index:forloop.counter0 }}</td> </tr> {% endfor %}
フィルタの作り方
まずは必要なフォルダ「templatetags」を作成
models.pyやviews.pyと同じ階層に作ります。
・フォルダ構成
templates
templatetags
models.py
views.py
templatetagsフォルダ内に
「__init__.py」と「index.py」を作成
「__init__.py」の中身は空で良いです。
・index.py
以下のようにリストからインデックス指定で値を返すindex関数を作成します。
from django import template register = template.Library() @register.filter def index(List, i): return List[int(i)]
以上で出来上がりです。
index.pyやその中の関数名等は適当に皆さんのやりたいことに合わせて変えてもらえれば大丈夫です。
以上