`
姜太公
  • 浏览: 73889 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

Django: Access request in template

阅读更多

默认情况下,模板是不能访问request的。要在模板里使用request,其实很简单。

 

首先,在视图里,我们不能再使用默认的Context(django.template.Context),而是要使用它的子类RequestContext (django.template.RequestContext),这个类很好很强大,一会你就知道了!

RequestContext的第一个参数是HttpRequest对象,在视图中我们直接使用request就行。

把以前的

c = Context(request, dict)

 改成

c = RequestContext(request, dict)

 dict是你想传递给模板的字典。

 

如果以前使用的是人见人爱的render_to_response

return render_to_response('template.html', {...})

 改成

return render_to_response('template.html', {...}, context_instance=RequestContext(request))

 也就是增加一个context_instance参数。

 

光这样还不行。在配置文件(一般是setting.py)中,找到TEMPLATE_CONTEXT_PROCESSORS,当然,你也可能找不到,因为默认生成的setting.py中没出现这个变量。无论如何,确保它的值是

TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.request"
)
 

 

 差不多了,到验证的时候了。在模板中加入一句{{ request }},是不是看到什么输出了。使用{{ requset.session}}

就可以访问session了。

 

为什么说RequestContext很强大呢,下面接着说

TEMPLATE_CONTEXT_PROCESSORS是一个元组,里面的每一个字符串其实代表了一个可调用(callable)对象,比如一个函数或可调用类。除了可调用外,它们满足下面两个条件:

   1.只有一个request对象作为参数

   2.而且要返回一个字典

你可以自定义context_processor,只要它满足上面的条件就行。

RequestContext会把context_processor返回的字典并入自己,也就相当于在context中添加了新的内容,而这这些内容可以直接在模板中访问。

默认情况下TEMPLATE_CONTEXT_PROCESSORS的值是

("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media")

所有的processor顺序执行,如果两个不同的processor返回的字典中有相同的key,后面的会覆盖前面的。

除了在TEMPLATE_CONTEXT_PROCESSORS中添加processor外,你还可以提供RequestContext额外的参数作为processor,例如

c = RequestContext(request, {...}, my_processor_1, my_processor_2...)

 这种方式更灵活,不过也更麻烦。

 

好了,下面看看默认的processor都干了些什么

1.django.core.context_processors.auth

   它给context添加了三个变量(其实也就是说它返回的字典中有三个key)

   user :如果用户登录了,这就是一个auth.User的实例,代表当前用户。如果用户没有登录,这就是AnonymousUser的实例,代表当前的匿名用户。

   messages: 传给当前用户的信息列表。

  perms: django.core.context_processors.PermWrapper的实例,表示当前用户的授权。

2.django.core.context_processors.debug

  这个家伙很懒,就算你把它放到了TEMPLATE_CONTEXT_PROCESSORS里,它也不愿意干活,你还要做点额外的工作才行。首先要确保在配置文件中DEBUG变量的值为True,然后,设置 INTERNAL_IP S,保证你的ip( 在request.META['REMOTE_ADDR']里可以看到 )在里面。

INTERNAL_IPS = ('127,0.0.1', ) #这是一个元组,每个ip都是字符串表示,本机设成127.0.0.1

做完这些,这家伙才开始工作。它给context添加了两个变量

   debug :True,这样我们可以在模板中使用{% if debug %}调试{% endif %}进行模板调试

   sql_queries: 表示本次请求所执行的sql的字典列表,列表中的每个字典表示一次sql查询,字典的格式是:

{'sql':..., 'time':...},sql表示执行的sql语句,time表示执行这条语句所用的时间。这个功能实在太棒了,能查看生成的sql语句,心里踏实啊!

3.django.core.context_processors.i18n

    这个processor比较简单,它也是添加两个变量(或者说key?)

   LANGUAGES :配置文件中的 LANGUAGES

   LANGUAGE_CODE :如果reqeust中有 LANGUAGE_CODE,这个值等于request. LANGUAGE_CODE,否则这个值是配置文件中的 LANGUAGE_CODE。

4.django.core.context_processors.media
   media processor是在Django1.0中才出现的,它使context包含MEDIA_URL,context[' MEDIA_URL '] = 配置文件中的MEDIA_URL。

5.django.core.context_processors.request

   添加一个变量request,表示当前请求的HttpRequest对象。

 

最重要的是可以自定义processor,如果很多模板页面都需要某个数据,自带的processor又无法满足,那就自己写一个出来,不就是一个函数嘛,简单!

10
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics