##はじめに
この記事はDjangoで初めてアプリを作る際に、Railsのhelperのような機能がないか調べた際の個人的メモです。
##環境
Python(3.6.2)
Django(2.1.7)
##カスタムテンプレートフィルタ
Railsのhelperはhelper内で定義したメソッドをview側で呼び出すことができます。Djangoでも同じように別ファイルで定義したメソッドをtemplate側で呼び出せないか調べたところ、カスタムテンプレートフィルタを作成することで実現できるようです。
##実装方法
以下の手順で、カスタムテンプレートフィルタを作成できます。
###1. templatetags というディレクトリを作成
カスタムフィルタを導入したいテンプレートのアプリディレクトリ内にtemplatetagsというディレクトリ を作成します。
###2. templatetagsに __init__.py を設置
templatetagsディレクトリ内で作成するファイルをモジュール化するために__init__.pyを設置します。
###3. templatetagsにカスタムテンプレートフィルタを定義するファイルを作成
まずテンプレートライブラリを呼び出します。
from django import template
register = template.Library()
このライブラリにオリジナルで作成するカスタムテンプレートフィルタを登録します。これで、template側で作成したメソッドを呼び出すことが可能になります。
@register.filter
def transrate_media_number(var):
if var == 0:
media_name = 'ぐるなび'
elif var == 1:
media_name = '食べログ'
elif var == 2:
media_name = 'ホットペッパー'
else:
media_name = 'その他'
return media_name
from django import template
register = template.Library()
@register.filter
def transrate_media_number(var):
if var == 0:
media_name = 'ぐるなび'
elif var == 1:
media_name = '食べログ'
elif var == 2:
media_name = 'ホットペッパー'
else:
media_name = 'その他'
return media_name
最終的には、以下のようなディレクトリ 構造になります。
app/
├ models.py
├ templatetags/
│ ├ __init__.py
│ └ custom_filter.py
└ views.py
###4. テンプレート側で呼び出す
まずはテンプレートから 作成した カスタムテンプレートフィルタ を読み込みます。
- load custom_filter
読み込まれたカスタムテンプレートフィルタは下記のような形で利用することができます。
{{ 引数 | カスタムテンプレートフィルタ名 }}
- load custom_filter
%table
{% for data in datum %}
%tr
%td
{{ data.take_at }}
%td
# {{ 引数 | カスタムテンプレートフィルタ名 }}
{{ data.media_number | transrate_media_number }}
これで完了です。