Django RequestContext
テンプレートの変数はcontextの値に置き換えられ、複数のページテンプレートに同じ変数が含まれている場合、例えば、各ページに{{user}}が必要である場合、愚かな方法は、各ページのリクエストビューにuserをcontextに配置することです.
以下のように簡単に書くこともできます.
しかし、このようにうまく書けない点は、コードの冗長性をもたらし、メンテナンスが容易ではないことであり、Contextのサブクラスであるdjangoを使用することができる.template.RequestContextは、テンプレートをレンダリングするときにContextを必要とせず、RequestContextを使用します.RequestConntextはrequestとprocessorsパラメータを受け入れる必要があります.processorsは
contextプロセッサのリストセット.
contextプロセッサ
これで各試行でcustom_prosはRequestContextのパラメータprocessorsに渡せばよい.renderならto_responseとRequestContextを組み合わせて使用するとrender_to_response受信パラメータcontext_instance.
しかし、これは面倒で、コードの冗長性は本当に解決されていません.関数でcontextプロセッサを明確に指定しなければなりません.そのため、Djangoはグローバルなcontextプロセッサを提供しています.
グローバルcontextプロセッサ
デフォルトではDjangoはパラメータを使用します
TEMPLATE_CONTEXT_PROCESSORSはデフォルトプロセッサを指定します.つまり、呼び出されたRequestContextであれば、デフォルトプロセッサで返されるオブジェクトはcontextに格納されます.
template_context_processorsのデフォルトはsettingsファイルにはありませんがglobal_に設定されています.settings.pyファイルに自分のcontextプロセッサを追加するには、自分のsettingsでなければなりません.pyに表示される指示パラメータ:TEMPLATE_CONTEXT_PROCESSORS
デフォルト:
または、
from django.temlate import loader,Context
t = loader.get_template('xx.html')
c = Context({'user':'zhangsan'})
return HttpResponse(t.render(c)) #httpresponse
以下のように簡単に書くこともできます.
from django.short_cuts import render_to_response
render_to_response('xxx.html',{'user':'zhangsan'})
しかし、このようにうまく書けない点は、コードの冗長性をもたらし、メンテナンスが容易ではないことであり、Contextのサブクラスであるdjangoを使用することができる.template.RequestContextは、テンプレートをレンダリングするときにContextを必要とせず、RequestContextを使用します.RequestConntextはrequestとprocessorsパラメータを受け入れる必要があります.processorsは
contextプロセッサのリストセット.
contextプロセッサ
from django.template import RquestContext
def custom_pros(request): #context
return {'age':22,'user':request.user}
#view
c = RequestContext(request,{'name':'zhang'},processors=[custom_pros])
return HttpResponse(t.render(c))
これで各試行でcustom_prosはRequestContextのパラメータprocessorsに渡せばよい.renderならto_responseとRequestContextを組み合わせて使用するとrender_to_response受信パラメータcontext_instance.
render_to_response('xxx.html',{'name':'zhang'},context_instance=RequestContext(request,processors[custom_pros])
しかし、これは面倒で、コードの冗長性は本当に解決されていません.関数でcontextプロセッサを明確に指定しなければなりません.そのため、Djangoはグローバルなcontextプロセッサを提供しています.
グローバルcontextプロセッサ
デフォルトではDjangoはパラメータを使用します
TEMPLATE_CONTEXT_PROCESSORSはデフォルトプロセッサを指定します.つまり、呼び出されたRequestContextであれば、デフォルトプロセッサで返されるオブジェクトはcontextに格納されます.
template_context_processorsのデフォルトはsettingsファイルにはありませんがglobal_に設定されています.settings.pyファイルに自分のcontextプロセッサを追加するには、自分のsettingsでなければなりません.pyに表示される指示パラメータ:TEMPLATE_CONTEXT_PROCESSORS
デフォルト:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',#django1.4 or after
'django.core.context_processors.auth', #django1.4 before
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'myapp.processor.foos',
)
または、
from django.conf import global_settings TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS +("myapp.processor.foos",)
, request RquestContext ok 。
render_to_response('xxx.html',{'age':33},context_instance=RequestContext(request))
, “myapp.processor.foos", 。
参照先:
http://stackoverflow.com/questions/7470179/module-django-core-context-processors-does-not-define-a-auth-callable-reques
http://stackoverflow.com/questions/2246725/django-template-context-processors
https://groups.google.com/forum/?fromgroups#!topic/django-users/1ntgBhfAulI