コンテキストプロセッサーの役割
コンテキストプロセッサーはざっくりと言えば、すべてのページに同じ変数を供給するための機能です。
例えば、ブログシステムなどでメニューを描画するとき、カテゴリの一覧を表示したいとします。
しかし、カテゴリはデータベースに登録されているため、メニューにハードコードできません。
では、全てのビューでカテゴリを取得してテンプレートに渡すのでしょうか?
それでも良いのですが面倒ですよね。
そういったときにコンテキストプロセッサーを使用します。
コンテキストプロセッサー内でカテゴリを取得して変数に渡しておけば全てのページでカテゴリの一覧を表示することができます。
便利ですね。
では、いつもの通り作成の仕方を紹介します。
作成の仕方
コンテキストプロセッサーには
- 本体の作成
- 登録
という二段構えでの運用となりますので覚えておいてください。
本体の作成
まずはコンテキストプロセッサー本体を作成します。
コンテキストプロセッサーを記述するファイルはどこにあっても構いません。
今回は、プロジェクトフォルダにlib
フォルダを作成して、その中に保存します。
lib/context_processors.py
次に、内容を記述します。
上記の例を出したカテゴリの一覧を取得してみましょう。
from category.models import Category
def get_context(request):
context = {}
context['categories'] = Category.objects.all()
return context
このようになります。
これで後述する登録を行うと、テンプレートでcategories
変数が使用可能となります。
もちろん、リストライクなデータですので普通にfor
でループすることができます。
お約束
コードを読むとわかると思いますが、第一引数にrequest
を受け取り、最終的には辞書を返しています。
これはコンテキストプロセッサーのお約束です。
また、他のコンテキストプロセッサーなどと変数名が同じだと上書きされることがあります。
これもお約束ですので、変数名の重複に注意してください。
登録
作成したコンテキストプロセッサーは登録しないと使用できません。
登録といってもたいそうなことではなく、設定ファイルにコンテキストプロセッサーとして扱う関数を設定するだけです。
設定ファイルのテンプレート部分は、デフォルトでは以下のようになっていると思います。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
この辞書TEMPLATES
内にあるOPTION
も辞書です。さらにその中にcontext_processors
というキーがあり、中身はリストになっています。
ここにはデフォルトで指定されているコンテキストプロセッサーがあります。
一番下に今回作成したオリジナルのコンテキストプロセッサーを追加しましょう。
追加するのはファイル名だけではなく、定義した関数名までです。
繰り返しになりますが今回は以下のパスに保存しています。
lib/context_processors.py
そして、定義した関数名はget_context
です。
Pythonのドット付きモジュール名で記述すると以下のようになります。
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'lib.context_processor.get_context', # ここを追加
],
},
},
]
これで登録は完了です。
まとめ
コンテキストプロセッサーは全てのページに同じ変数を提供します。
しかし、関数で定義されることに注目してください。
ページにアクセスされるたびに関数が評価されます。
同じ変数を提供するだけではない使い方も可能です。
いろいろ試してみてください。