初心者向け

【Django】コンテキストプロセッサー(context processor)について

コンテキストプロセッサーの役割

コンテキストプロセッサーはざっくりと言えば、すべてのページに同じ変数を供給するための機能です。

例えば、ブログシステムなどでメニューを描画するとき、カテゴリの一覧を表示したいとします。

しかし、カテゴリはデータベースに登録されているため、メニューにハードコードできません。

では、全てのビューでカテゴリを取得してテンプレートに渡すのでしょうか?

それでも良いのですが面倒ですよね。

そういったときにコンテキストプロセッサーを使用します。

コンテキストプロセッサー内でカテゴリを取得して変数に渡しておけば全てのページでカテゴリの一覧を表示することができます。

便利ですね。

では、いつもの通り作成の仕方を紹介します。

作成の仕方

コンテキストプロセッサーには

  1. 本体の作成
  2. 登録

という二段構えでの運用となりますので覚えておいてください。

本体の作成

まずはコンテキストプロセッサー本体を作成します。

コンテキストプロセッサーを記述するファイルはどこにあっても構いません。

今回は、プロジェクトフォルダに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',  # ここを追加
            ],
        },
    },
]

これで登録は完了です。

まとめ

コンテキストプロセッサーは全てのページに同じ変数を提供します。

しかし、関数で定義されることに注目してください。

ページにアクセスされるたびに関数が評価されます。

同じ変数を提供するだけではない使い方も可能です。

いろいろ試してみてください。

-初心者向け
-,