默认情况下,模板是不能访问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又无法满足,那就自己写一个出来,不就是一个函数嘛,简单!
分享到:
相关推荐
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.
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
Two Scoops of Django : Best Practices for Django 1.8, Third Edition, 2015-05-20. 原版PDF
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 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 中request.get和request.post的区别 POST和GET差异: POST和GET是HTTP协议定义的与服务器交互的方法。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。另外,还有PUT和DELETE方法。 POST和GET都...
The Definitive Guide to Django - Web Development Done Right(2nd) 英文无水印pdf 第2版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 ...
fcm-django:FCM Django:通过django通过FCM(Firebase Cloud Messaging)将推送通知发送到网站,iOS和android移动设备
欢迎使用@ koromerzhin / template-django :waving_hand: d'un nouveau projet django模板 :house: 需要 软件: 制作 npm 码头工人 库罗默任(Koromerzhin)/ traefikproxy储存库 配置: 码头工人 主持人: ...
django:完美主义者的Web框架,有最后期限
django:3.0 依赖包: pillow,django-simpleui,django_summernote 测试用户(数据库已存在): root 123456 超级管理员可自己创建 author:Ericam_ 项目版本: python:3.7 django:3.0 依赖包: pillow,...
首先,我们先来认识Django: Django是一个高级的Python Web框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,可以专注于编写应用程序,而无需重新开发。 接...
pytest-django:pytest的Django插件
RabbitMQ与Django 在Django Web应用程序中结合使用Microservices和RabbitMQ的示例
django-request-id 使用唯一的request_id属性增强每个请求,并提供记录请求日志的帮助器。 在开发和使用。 快速开始 在您的requirements.txt文件中包含django-request-id 。 将request_id添加到INSTALLED_APPS ...
学习Django:Django
django:django专案
secure-django:安全django博客
Django:Aprendendo Django