django の template(テンプレート)ファイルの中で色々なプログラムを書いていると辞書のキーに対して変数でアクセスしたい場面が出てくると思います。
しかし通常のものではキーは決められた値かもしくはカウントアップで変化させるぐらいしか対応できなくてもどかしく感じるかもしれません。
しかし、 django ではそんな時にでも対応できるようにカスタムフィルターという機能がありますので、この機能を利用して django の辞書に変数でアクセスする方法を解説します。
template ファイルにおける辞書のキーの指定方法
template ファイルで辞書を展開するとき、辞書の値(value)を取得するには通常 key の値は {{ dictkey.dictvalue }}のようにする必要があります。
そのため、以下のように変数でアクセスすると何も取得されずブラウザには表示されません。
これを回避するためにカスタムフィルターという機能を利用します。
カスタムフィルターの使い方
django ではカスタムフィルターを使うには以下のようなファイルを用意します。
template.Library() の filter 関数でデコレートすることで関数をカスタムフィルターとして登録することができます。
これを利用して辞書のキーを変数でアクセスするようにする関数を定義して template で利用することになります。
カスタムフィルターを利用し、辞書のキーに変数を指定する方法
1. カスタムフィルター用のファイル作成
さてそれでは本題のテンプレートファイルで辞書のキーに変数でアクセスする方法について解説します。
カスタムフィルターに登録する関数の内容に辞書のキーを変数で持ってくるような処理を記載するだけです。
そのため以下のようなファイルを作成します。
1 2 3 4 5 6 7 8 9 10 |
# coding=utf-8 from django import template register = template.Library() @register.filter(name='lookup') def lookup(value, arg, default=""): if arg in value: return value[arg] else: return default |
キーが辞書の中に含まれればそのキーに対応する値を返却しそれ以外は空白を返すという関数ですが、これで template で辞書に変数を指定できるようになります。
ファイル名は適当に [custom_filter.py] とかでよいです。
2. カスタムフィルター用のファイルの配置
さてこの処理を記載したファイルを置く場所ですが、どこでもいいというわけではないので注意してください。
置く場所は以下のようにします。

プロジェクトフォルダの下に大体アプリフォルダを入れていると思いますが、その中に「templatetags」というフォルダを用意し、その中に初期ファイルの「__init__.py」と今回作成したカスタムフィルター用のファイル「custom_filter.py」を入れてあげればオッケーです。
3. テンプレートファイルでのカスタムフィルターの読み込み
さてこれで準備ができたので、テンプレートファイルで使用します。
まず作成したカスタムフィルターを読み込むためにテンプレートファイル以下の記述を施します。
load タグで作成したカスタムフィルターのファイル名を指定することで利用できるようになります。
今回は [custom_fileter.py] という関数名なのでそれを拡張子を除いて記載すればオッケーです。
記載する場所はテンプレートファイルの一番上とかで構いません。
4. カスタムフィルターの利用
これでカスタムフィルターの読み込みができたのでカスタムフィルターを実際に以下のように利用します。
変数で取り出したい辞書の横にパイプで区切り、カスタムフィルター関数で呼び出すことで変数で辞書の値にアクセスできるようになります。
いかがでしょうか。
辞書のキーを変数指定したい場面って結構多いと思いますので、ファイルを用意しておくとかなり便利になると思います。
今回はここまでです。
お疲れ様でした。
コメント