Djangoテンプレートでpythonの組み込み関数を利用する

Djangoテンプレート内でPythonの組み込み関数zip,range,dir,getattrなどの関数を利用できるようにするライブラリのご紹介。

Django-Boost

Djangoでよく使うパターンやちょっと便利なミックスインクラスや関数群をまとめたライブラリです。

GitHub
https://github.com/ChanTsune/django-boost

今回はその中でもテンプレート内で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の組み込み関数を利用できるようにするライブラリとその簡単な使い簡単な説明でした。