むろっちのStacking

日々の中で学んだIT知識をメモして置く場所

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 }}

この形であればルーティングベースで利用できる変数が異なる場合でも 一定の動作をする機能が利用できる