はじめに
大高隆・著「動かして学ぶ!Python Django開発入門」を使用して
python・Djangoの学習を始めた初学者です。
ruby・railsを使用して4ヶ月ほどプログラミングの勉強をしていましたが、
エンジニア転職にあたり、pythonを使用することになったのでこの本を片手に勉強を始めました。
ド級の素人なので、補足・ご指摘等コメントいただけると大変助かります。
概要
djangoで作成したアプリのHTML上に割り算の結果(百分率)を表示したい。
ついでに四捨五入もして欲しい。
試したこと
自作のフィルタを作ってあげることにしました。
下記、__旧__ver.のドキュメンテーションの引用です。
https://djangoproject.jp/doc/ja/1.0/howto/custom-template-tags.html
Django テンプレートシステムには、広範な 組み込みタグとフィルタが付属していて、アプリケーションのプレゼンテーションロジックに纏わる問題を解決できます。とはいえ、コアのテンプレートタグプリミティブだけでは、要求を満たせない場合もあります。そういう場合のために、テンプレートエンジンを拡張できます。Pythonで自作のタグやフィルタを書き、 テンプレート上で {% load %} タグを使って使えるのです。
コードの配置
カスタムのテンプレートタグやフィルタはDjangoのアプリケーション内に置きます。既存のアプリケーションに関連があるのなら、そのアプリケーションにバンドルすればよいでしょう。そうでなければ、コードを入れておくための新たなアプリケーションを作成します。
アプリケーション内には、templatetagsディレクトリを置かねばなりません。このディレクトリは、models.pyやviews.pyなどと同じ階層に置きます。templatetagsがなければ、作成してください。ディレクトリ内に__init__.py を置いて、パッケージ化するのを忘れないでください。
カスタムのタグやフィルタは、templatetagsディレクトリの下に置きます。モジュールファイルの名前は、あとでタグをロードするときに使う名前にします。ですから、他のアプリケーションのカスタムタグやフィルタと名前が衝突しないよう、よく注意して名前を決めましょう。
①templatetagsディレクトリと以下ファイルを作成
カスタムテンプレートやフィルタを記述するディレクトリ・ファイルを用意しておきます。
階層はmodels.pyやviews.pyと同じ階層に置いておきます。
views.py
models.py
.
.
.
templatetags
├─ __init__.py
└─ hoge_tag.py
②hoge_tag.py内に割り算の処理を記述
round関数で四捨五入します。
value→割られる数
args→割る数
filterの名前はdivisionとしておきます。
from django import template
register = template.Library()
@register.filter(name="division")
def division(value, args):
return round(value / args * 100, 2)
最後の"2"で四捨五入後に小数点何桁まで残すかを定義しています。
※ただし、round関数を用いた数字の丸め方には注意してあげる必要があります。
浮動小数点数に対する round() の振る舞いは意外なものかもしれません: 例えば、 round(2.675, 2) は予想通りの 2.68 ではなく 2.67 を与えます。これはバグではありません: これはほとんどの小数が浮動小数点数で正確に表せないことの結果です。
詳しくは下記をご参考に。
https://docs.python.org/ja/3/library/functions.html#round
③hoge_tag.pyをHTMLで読み込む
先程の計算式を使いたいHTMLで、計算式が読み込めるよう下記を追加。
{% load hoge_tag %}
あとは表示してあげるだけ。
{{ hoge | division:fuga}}%
"hoge"、"fuga"に数値(変数可)を入れてあげれば薔薇色の世界が見えてきますね。
偉大な参考記事
・テンプレートタグやフィルタを自作する
・組み込み関数(python公式)
・[Django]templatesで掛け算の処理をしたい→ないのでフィルタを作って対応