【Django】contextを共通化する方法【Middlewareみたい!】

contextをMiddlewareみたいに共通化できるcontext_processorsをやってみます。

417

context_processorsを作成します!

ファイル名は何でもいいです。
polls/context_processors.py

from .models import *
from django.http import HttpRequest

def get_options(request: HttpRequest):

    options = Option.objects.all()
    context = {}
    context["OPTIONS"] = {}
    context["OPTIONS"]['url'] = f'{request.scheme}://{request.get_host()}{request.path}'
    for option in options:
        context["OPTIONS"][option.name] = option.value

    return context

context_processorsを登録

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['mysite/templates'],
        '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',
                'polls.context_processors.get_options', # 追加しました
            ],
        },
    },
]
Middlewareみたいに簡単に扱えて使いやすいです!

417

ただMiddlewareと違って呼び出しが、必ずviewの後になってしまうようなので、viewでいじるために、代入するような使い方をしたい場合はMiddlewareもしくはTemplateViewでやる必要がありますね。

417

【Django】でMiddlewareを自作してみる 【Django】でMiddlewareを自作してみる DjangoでViewの共通化を行う方法【TemplateView】 DjangoでViewの共通化を行う方法【TemplateView】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です