【django】templateにおける辞書に対して変数でアクセスする方法

django の template(テンプレート)ファイルの中で色々なプログラムを書いていると辞書のキーに対して変数でアクセスしたい場面が出てくると思います。
しかし通常のものではキーは決められた値かもしくはカウントアップで変化させるぐらいしか対応できなくてもどかしく感じるかもしれません。
しかし、 django ではそんな時にでも対応できるようにカスタムフィルターという機能がありますので、この機能を利用して django の辞書に変数でアクセスする方法を解説します。

スポンサーリンク
目次

template ファイルにおける辞書のキーの指定方法

template ファイルで辞書を展開するとき、辞書の値(value)を取得するには通常 key の値は {{ dictkey.dictvalue }}のようにする必要があります。

そのため、以下のように変数でアクセスすると何も取得されずブラウザには表示されません。

{% for key in dictlist %}
{{ dict.key}} ←何も表示されない
{% endfor %}

これを回避するためにカスタムフィルターという機能を利用します。

カスタムフィルターの使い方

django ではカスタムフィルターを使うには以下のようなファイルを用意します。

from django import template
register = template.Library() #テンプレートタグ用のライブラリ

#カスタムフィルターとして利用するための関数
@register.filter(name=‘カスタムフィルターの名前’)
def 関数名(value):
  #行いたい処理

template.Library() の filter 関数でデコレートすることで関数をカスタムフィルターとして登録することができます。
これを利用して辞書のキーを変数でアクセスするようにする関数を定義して template で利用することになります。

カスタムフィルターを利用し、辞書のキーに変数を指定する方法

1. カスタムフィルター用のファイル作成

さてそれでは本題のテンプレートファイルで辞書のキーに変数でアクセスする方法について解説します。
カスタムフィルターに登録する関数の内容に辞書のキーを変数で持ってくるような処理を記載するだけです。
そのため以下のようなファイルを作成します。

キーが辞書の中に含まれればそのキーに対応する値を返却しそれ以外は空白を返すという関数ですが、これで template で辞書に変数を指定できるようになります。
ファイル名は適当に [custom_filter.py] とかでよいです。

2. カスタムフィルター用のファイルの配置

さてこの処理を記載したファイルを置く場所ですが、どこでもいいというわけではないので注意してください。
置く場所は以下のようにします。

プロジェクトフォルダの下に大体アプリフォルダを入れていると思いますが、その中に「templatetags」というフォルダを用意し、その中に初期ファイルの「__init__.py」と今回作成したカスタムフィルター用のファイル「custom_filter.py」を入れてあげればオッケーです。

3. テンプレートファイルでのカスタムフィルターの読み込み

さてこれで準備ができたので、テンプレートファイルで使用します。
まず作成したカスタムフィルターを読み込むためにテンプレートファイル以下の記述を施します。

{% load <カスタムフィルターのファイル名> %}

{% load custom_filter %}

load タグで作成したカスタムフィルターのファイル名を指定することで利用できるようになります。
今回は [custom_fileter.py] という関数名なのでそれを拡張子を除いて記載すればオッケーです。
記載する場所はテンプレートファイルの一番上とかで構いません。

4. カスタムフィルターの利用

これでカスタムフィルターの読み込みができたのでカスタムフィルターを実際に以下のように利用します。

{{ 辞書変数 | <カスタムフィルターで登録した関数名>:key}}

{% for key in list %}
{{ dict | lookup : key }}
{% endfor %}

変数で取り出したい辞書の横にパイプで区切り、カスタムフィルター関数で呼び出すことで変数で辞書の値にアクセスできるようになります。

いかがでしょうか。
辞書のキーを変数指定したい場面って結構多いと思いますので、ファイルを用意しておくとかなり便利になると思います。
今回はここまでです。
お疲れ様でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

本業ではPHPを使ったWEBアプリやJavaを使用した基幹アプリを作成しております。Pythonは個人的に勉強しており、E資格を取ったりしたおかげで、業務でAIの研究とかも任されるようになりました。学習のアウトプットのために本サイトを運営しておりますが、これからPythonを学ぶという人のお役に立てればいいなと思います。わからないことや調査して記事にしてほしいことがございましたらご連絡いただけると幸いです。

コメント

コメントする

目次
閉じる