LoginSignup
1
1

More than 3 years have passed since last update.

DjangoでRailsのhelperのような機能を実装する方法

Last updated at Posted at 2020-11-15

はじめに

この記事は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

custom_filter.py
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

読み込まれたカスタムテンプレートフィルタは下記のような形で利用することができます。

  {{ 引数 | カスタムテンプレートフィルタ名 }}
template_file.html.haml
- load custom_filter

%table
  {% for data in datum %}
    %tr
      %td
        {{ data.take_at }}
      %td
        # {{ 引数 | カスタムテンプレートフィルタ名 }}
        {{ data.media_number | transrate_media_number }}

これで完了です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1