Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

はじめに

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

これで完了です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away