web-dev-qa-db-ja.com

djangoで独自のコンテキストプロセッサを作成する

私はすべてのビューに特定の変数(ほとんどがカスタム認証タイプの変数)を渡す必要があります。

これを行うには、独自のコンテキストプロセッサを書くことが最善の方法であると言われましたが、いくつかの問題があります。

私の設定ファイルは次のようになります

TEMPLATE_CONTEXT_PROCESSORS = (
    "Django.contrib.auth.context_processors.auth",
    "Django.core.context_processors.debug",
    "Django.core.context_processors.i18n",
    "Django.core.context_processors.media",
    "Django.contrib.messages.context_processors.messages",
    "sandbox.context_processors.say_hello", 
)

ご覧のとおり、「context_processors」というモジュールと、その中の「say_hello」という関数があります。

どのように見える

def say_hello(request):
        return {
            'say_hello':"Hello",
        }

自分の意見の中で次のことができるようになったと思いますか?

{{ say_hello }}

今のところ、これは私のテンプレートでは何もレンダリングしません。

私の見方は

from Django.shortcuts import render_to_response

def test(request):
        return render_to_response("test.html")
75
dotty

作成したコンテキストプロセッサは動作するはずです。問題はあなたの意見です。

ビューがRequestContextでレンダリングされていることを確信していますか?

例えば:

def test_view(request):
    return render_to_response('template.html')

上記のビューでは、TEMPLATE_CONTEXT_PROCESSORSにリストされているコンテキストプロセッサは使用されません。次のようにRequestContextを指定していることを確認してください。

def test_view(request):
    return render_to_response('template.html', context_instance=RequestContext(request))
49
TM.

Django docs によると、context_instance引数でrender_to_responseの代わりにrenderをショートカットとして使用できます。

または、render()ショートカットを使用します。これは、requestContextの使用を強制するcontext_instance引数を指定したrender_to_response()の呼び出しと同じです。

28
bpetit

Django 1.8であるため、次のようにカスタムコンテキストプロセッサを登録します。

TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [
            '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',
                'www.context_processors.instance',
            ],
        },
    },
]

コンテキストプロセッサがappにあると仮定するとwww in context_processors.py

9
andilabs

Djangoのrender_to_response()ショートカットを使用してテンプレートに辞書の内容を入力している場合、テンプレートにはデフォルトでContextインスタンス(RequestContextではなく)が渡されます。テンプレートレンダリングでRequestContextを使用するには、render()の呼び出しと同じであるrender_to_response()ショートカットを使用し、_context_instance_引数を使用してRequestContextの使用。

2
GrvTyagi