1. ホーム
  2. スクリプト・コラム
  3. パール

Django フレームワークでテンプレートフィルタをカスタマイズする

2022-01-03 05:46:30

カスタムフィルタは、1つまたは2つの引数を持つPython関数です。

  •     (入力)変数の値
  •     パラメータの値。デフォルトまたは完全に空白の状態

例えば、フィルター {{ var|foo: "bar" }} では、フィルター foo には変数 var とデフォルトのパラメーター bar が渡されます。

フィルタ関数は常に戻り値を持つべきである。また、例外は発生させず、すべて静かに失敗するようにしなければなりません。エラーが発生した場合は、生の入力か空文字列を返すべきで、その方が理にかなっている。

以下に、フィルタを定義する例を示します。

def cut(value, arg):
  "Removes all values of arg from the given string"
  return value.replace(arg, '')



以下は、変数値からスペースを除去するためのフィルタの例です。

{{ somevariable|cut:" " }}



ほとんどのフィルターは、引数を必要としません。次の例では、関数から引数を取り出しています。

def lower(value): # Only one argument.
  "Converts a string into all lowercase"
  return value.lower()



フィルタを定義したら、それを Django のテンプレート言語である

register.filter('cut', cut)
register.filter('lower', lower)



library.filter()メソッドは、2つの引数を取ります。

  •     フィルタの名前(文字列)
  •     フィルタ機能そのもの

Python 2.4 以降を使用している場合は、デコレータ register.filter() を使用することができます。

@register.filter(name='cut')
def cut(value, arg):
  return value.replace(arg, '')

@register.filter
def lower(value):
  return value.lower()



2 番目の例のように name 引数を省きたい場合、Django は関数名をフィルタの名前として扱います。

以下は、フルテンプレートライブラリにカットフィルタを適用した例です。

from django import template

register = template.Library()

@register.filter(name='cut')
def cut(value, arg):
  return value.replace(arg, '')