Djangoテンプレートのfilterを自作する
テンプレートのフィルターで3桁ごとに数値の区切りが欲しかったので filterの自作をしてみた
フィルタ関数の作成
APP名/templatetags/tags.py
from django import template register = template.Library() @register.filter(name='num_delimiter') def num_delimiter(value): return '{:,}'.format(int(value))
- APP名/templatetags配下に.pyファイルを作成。そこに登録したい関数を作成する。引数はvalue,[args]が利用できる * value: "|"より前の文字 * args: フィルタ名:argsの形で取る引数
- テンプレート登録用のクラス Libruaryを作成
- 登録用メソッドデコレータを利用して登録する
Viewでの使い方
- load フィルタタグファイル名でloadする
- 通常のフィルタと同じように利用する
{% extends "base.html" %} {% load tags %} {% block content %} <div class="container-fluid"> {{ '1234567890'|num_delimiter }} {{ ''|total }}
できあがり
templateにモデル層を組み込む
フィルタを templateで利用できる関数として考えると、複数テンプレートで共通の機能を 提供するフィルタ(関数)を作成できる
templatetags/tags.py
from django import template register = template.Library() from todo.models import Todo @register.filter(name='total') def total(value): return len(Todo.objects.all())
index.html
{% extends "base.html" %} {% load tags %} {% block content %} <div class="container-fluid"> {{ '1234567890'|num_delimiter }} {{ ''|total }}
この形であればルーティングベースで利用できる変数が異なる場合でも 一定の動作をする機能が利用できる