posts - 431,  comments - 344,  trackbacks - 0

原文地址:http://jjz.javaeye.com/blog/282805
默认情况下,模板是不能访问request的。要在模板里使用request,其实很简单。
首先,在视图里,我们不能再使用默认的Context(django.template.Context),而是要使用它的子类RequestContext (django.template.RequestContext),这个类很好很强大,一会你就知道了!
RequestContext的第一个参数是HttpRequest对象,在视图中我们直接使用request就行。
把以前的Python代码
c = Context(request, dict)  
改成Python代码
c = RequestContext(request, dict)  
dict是你想传递给模板的字典。
如果以前使用的是人见人爱的render_to_response
Python代码
return render_to_response('template.html', {...})  
改成
Python代码
return render_to_response('template.html', {...}, context_instance=RequestContext(request))  
也就是增加一个context_instance参数。

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

Python代码
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的值是
Python代码
(
    "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,例如
Python代码
  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_IPS,保证你的ip( 在request.META['REMOTE_ADDR']里可以看到 )在里面。
Python代码
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。 
  如果不使用这个,想在页面获取这两个值可以使用:
  {% get_current_language as LANGUAGE_CODE %}
  {{LANGUAGE_CODE}}
  {% get_available_languages as LANGUAGES %}|
  {{LANGUAGES}}

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又无法满足,那就自己写一个出来,不就是一个函数嘛,简单!

posted on 2008-12-04 12:58 周锐 阅读(799) 评论(0)  编辑  收藏 所属分类: Python

只有注册用户登录后才能发表评论。


网站导航: