Django RequestContext

4078 ワード

テンプレートの変数はcontextの値に置き換えられ、複数のページテンプレートに同じ変数が含まれている場合、例えば、各ページに{{user}}が必要である場合、愚かな方法は、各ページのリクエストビューにuserをcontextに配置することです.
 
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