Qstairs

起業に向けた活動、およびAndroid・画像認識(人工知能、Deep Learning等)の技術を紹介します

広告

【Django】テンプレートフィルタを自作する!

f:id:qstairs:20160601221351j:plain

はじめに

DjangoWEBサービスをガリガリ開発しています。
開発している中で、
views.pyから画面に渡されたリストデータを
インデックス指定して値を取得したい事態になりました。

予め用意してあるDjangoのテンプレートフィルタの中に、
リストデータからインデックス指定して値を取得する機能はありません。

そこで、今回以下のサイトを参考に、
テンプレートフィルタを自作しました。

テンプレートタグやフィルタを自作する — Django 1.4 documentation

完成ソース

リスト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やその中の関数名等は適当に皆さんのやりたいことに合わせて変えてもらえれば大丈夫です。


以上

広告