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


81

すべてのビューに特定の変数(主にカスタム認証タイプの変数)を渡す必要があるところまで来ました。

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

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

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")

回答:


54

あなたが書いたコンテキストプロセッサは動作するはずです。問題はあなたの見解にあります。

ビューがレンダリングされていることを確信してい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))

1
'context_instance'が欠けていたものです!おかげTM
義母

フォローアップ、なぜこのcontext_instanceが必要なのですか?djangoの認証システムを使用しているのに、なぜこれが必要ないのですか?
dotty 2010年

1
Djangoの組み込みビューは、これを処理します(を使用しますRequestContext)。作成したコンテキストプロセッサについて考えてみてください。request引数として取ります。つまり、レンダリングロジックに現在のリクエストを何らかの方法で与える必要があります。RequestContext基本的には、すべてのコンテキストプロセッサをループして現在のリクエストをプロセッサに渡し、その結果でページコンテキストを更新するという単純なロジックを処理するだけです。
TM。

ビューを変更してコンテキストを要求できますか?
dotty 2010年

3
@TM。 return render_to_response('template.html', context_instance=RequestContext(request))古いreturn render(request,'template.html')
ファッション

29

djangoのドキュメントによるrenderと、context_instance引数を指定してrender_to_responseの代わりにショートカットとして使用できます。

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


確かに、最近それは可能です。
fabspro 2014

9

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',
            ],
        },
    },
]

コンテキストプロセッサがアプリ内wwwにあると仮定しますcontext_processors.py


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.