默认情况下,模板是不能访问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又无法满足,那就自己写一个出来,不就是一个函数嘛,简单!
分享到:
相关推荐
django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,...
Django:Django高级特性:RESTful API开发.docx
Django:Django高级特性:自定义管理后台.docx
Django:Django实战项目:在线商城系统开发.docx
Django:Django高级特性:WebSocket与实时通信.docx
Django:Django信号与事件监听.docx
Django:Django框架简介与环境搭建.docx
Django:Django模型设计与数据库操作.docx
Django:Django部署与生产环境配置.docx
Django:Django表单处理与数据验证.docx
Django:Django错误处理与调试技巧.docx
Django:Django静态文件与媒体文件处理.docx
wo Scoops of Django: Best Practices For Django 1.8 is chock-full of even more material that will help you with your Django projects.
Mastering Django: Core is a completely revised and updated version of the original Django Book, written by Adrian Holovaty and Jacob Kaplan-Moss – the creators of Django. The main goal of this book ...
Chapter 4: Jinja Templates in Django Chapter 5: Django Application Management Chapter 6: Django Forms Chapter 7: Django Models Chapter 8: Django Model Queries and Managers Chapter 9: Django Model ...
Two Scoops of Django: Best Practices For Django 1.6 (2014版)pdf
Chapter 14: Template Tags and Filters Chapter 15: Django Templates and Jinja2 Chapter 16: Building REST APIs with Django REST Framework (NEW) Chapter 17: Consuming REST APIs Chapter 18: Tradeoffs of ...
本资源"【初识Django:轻松掌握Web框架实战技巧】源码资料"是为Python初学者量身定制的,通过一个可运行的Django博客应用实例,帮助大家深入理解Django框架的核心概念和实践技能。 首先,Django的核心组件包括模型...
Django 中request.get和request.post的区别 POST和GET差异: POST和GET是HTTP协议定义的与服务器交互的方法。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。另外,还有PUT和DELETE方法。 POST和GET都...
Django遵循MVC设计模式,即模型(Model)、视图(View)、模板(Template),并提供了一个由许多可重用组件构成的系统,以帮助开发者构建高质量的Web应用。本文将详细介绍如何在Python中使用Django框架,包括环境...