Qstairs

現役AIベンチャーCTOの知見、画像認識(人工知能、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やその中の関数名等は適当に皆さんのやりたいことに合わせて変えてもらえれば大丈夫です。


以上

広告