[Django]templatesで掛け算の処理をしたい→ないのでフィルタを作って対応

django

Djangoアプリケーションのテンプレート内で数値を保持した変数に掛け算処理をしたいケースに遭遇しました。

その実装方法を紹介します。

Djangoではテンプレート内に直接処理を記述できない

DjangoはRuby on Railsと違いテンプレート内(RailsではView)に直接処理を記述できません。

RailsではERBテンプレートを使うことでRubyを直接埋め込むことができ、複雑な処理を記述できます。

しかし、Djangoでは「あえて」この方式を採用していません。

テンプレート内にごちゃごちゃ処理を書くよりも他で書いて、それをテンプレートに反映させた方が見通しが良くなるからですね。

そのため組み込みタグやフィルターを使って目的の挙動を実現することができます。

でも、目的のものがない場合もある

アプリケーションを作る時におよそ利用するであろうものは揃っています。

https://docs.djangoproject.com/ja/2.0/ref/templates/builtins/

 

しかし、中にはないものもあります。

今回、欲しいと思った機能は掛け算の処理を行うもの。非常にシンプルな処理ですがありませんでした。足し算はあったのですが。

なければ作ってしまうこともできるので下記では自作フィルターの作り方を紹介していきます。

 

Djangoで自作フィルターを実装する

必要なことを下記にまとめると、

  • アプリケーション直下にtemplatetagsディレクトリを作成する
  • そのディレクトリの中に__init__.pyと処理を記述するファイルを作成(名前はapp名_tagとしました)
  • その自作フィルターを使いたいtemplateファイル内でloadする

これだけです。1つずつ見ていきましょう。

templatetagsディレクトリの作成は簡単ですね。

そのディレクトリ内に掛け算の自作フィルターの処理を記述しました。

from django import template


register = template.Library()

@register.filter(name="multiplie")
def multiplie(value, args):
    return value * args

templateをimportします。

今回、フィルターの名前はmultiplieにしました。

第一引数がテンプレート内で受け取る変数。第二引数に掛ける数値を入れます。

 

あとはテンプレート内で処理を記述してあげます。

{% load app_tag %} // 作成したファイル名を記述

{{ review.score | mulitiplie:20}}

ここでは変数から数値を受け取り、それを20倍する処理となります。



カテゴリー