Djangoテンプレートでpythonの組み込み関数を利用する
Djangoテンプレート内でPythonの組み込み関数zip
,range
,dir
,getattr
などの関数を利用できるようにするライブラリのご紹介。
Django-Boost
Djangoでよく使うパターンやちょっと便利なミックスインクラスや関数群をまとめたライブラリです。
今回はその中でもテンプレート内でPythonの組み込み関数を利用できるようにする方法の紹介です。
導入
pip install django_boost
pip でインストールします。
プロジェクトに組み込む
Djangoを普段から利用する方は、お馴染みアプリケーションの追加です。
setings.py
INSTALLED_APPS = [
...
'django_boost',
]
テンプレートでPython組み込み関数を利用する
{% load boost %}
とすることで、テンプレートの中でPythonのほとんどの組み込み関数が、フィルターやタグとして利用できるようになります。
range
{% for i in 5|range %}
<p>{{ i }}</p>
{% endfor %}
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
{% for i in 1|range:3 %}
<p>{{ i }}</p>
{% endfor %}
<p>1</p>
<p>2</p>
zip
{% for i , j in some_list1|zip:some_list2 %}
{{ i }}{{ v }}
{% endfor%}
dir
{'value':"string"}
{{ value|dir }}
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
開発中に、属性の一覧が簡単に確認できるので地味に便利。
getattr
{{ value|getattr:"__class__" }}
Djangoテンプレートの中では、_
(アンダースコア)から始まる属性にアクセス出来ないので、これもあると便利だったりします。
format
地味に便利なformat
関数ですね。
数字に3桁ごとにカンマを入れたかったりするときに重宝します。
{{ 1000|format:"," }}
少数の桁数を指定して表示したいときや、パーセント表示したい時も便利です。
{{ 0.333333|format:".2f"}}
{{ 0.333333|format:"%"}}
組み込みの関数ではありませんが、オブジェクトが反復可能オブジェクトかどうかを判定するフィルターもあったりします。
- isiterable
URLエンコード
外部のサービスと連携させる際にURL文字列をエスケープするような場面があると思いますが、それもフィルターとして提供しています。
{% load boost_url %}
とすることで、以下のフィルター、タグが利用できるようになります。
urlencode
文字列をURLエンコード(パーセントエンコード)します。{"url" : "https://sample.com" }
{ url | urlencode }
{# 'https%3A//sample.com' #}
処理の実態はurllib.parse.quote
関数です。
urldecode
urlencodeと逆の挙動をします。{"url" : "https%3A//sample.com" }
{ url | urldecode }
{# https://sample.com #}
こちらも処理の実態はurllib.parse.unquote
関数です。
replace_parameters
URLのクエリ文字列(URLの?以降の文字列 e.g. ?id=1
) を足したり入れ替えたりするタグです。
{% replace_parameters request 'id' '1' %}
上記のタグはアクセスしたページのURLのクエリ文字列がない場合?id=1
と展開されます。
{% replace_parameters request 'id' '2' %}
すでに同じキーのクエリがある(?id=1
)場合、値が置き換えられます。?id=2
{% replace_parameters request 'id' '2' 'sort' 'date' %}
複数のキーバリューを指定することもできます。?id=2&sort=date
ページネーションなどの際に利用すると便利なのではないでしょうか?
実はこのサイトのページネーションにはこの機能を利用していたりします。
最後に
以上、テンプレート内でPythonの組み込み関数を利用できるようにするライブラリとその簡単な使い簡単な説明でした。