[Django]templatesで掛け算の処理をしたい→ないのでフィルタを作って対応
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倍する処理となります。