Django 学习笔记 (VIII)

第九章 高级模板进阶

这章延续前面的模板教程内容,开头的模板设计先就跳过,下面记录新的内容:

1. RequestContext 与 Context 处理器

前面已经学到,一个网页的呈现需要使用 Template 对象渲染一个 Context,才能得到最终的呈现; 现在问题是如果一系列视图都会使用部分重复的 context 信息(例如 session 登录信息)应该如何进行重构解耦?

这里我们引入一个 django.template.ContextTemplate 类: 回忆此前,我们创建一个 Context 类只需要给定一个字典——现在,我们可以用 RequestContext 对象来代替之; RequestContext 对象接收三个参数,分别是 request/字典/processor 这样无非是多传递一个 request 对象进去,关键在于 processor: processor 是一个接受 request 对象,返回一个字典的处理函数,按照这样来构造 RequestContext 对象的的时候,会把第二个参数给出的字典对象与 processor 给出的对象合并,作为最终的 context 字典。

如此一来,对于一些公共的模板参数,就可以通过指定一个公用的 processor 来进行重构,这起码是一步明显的去重解耦;

这样还不够简洁,如果我们使用 render_to_response 函数,那么我们可以在第三个参数附上一个 ContextRequest 对象;

当然还是不简洁,所以我们可以在 settings.py 里面设置一个默认的 TEMPLATE_CONTEXT_PROCESSORS 全局路径,用于指定默认的 processor,只需要按照格式在相关模块添加相应的函数路径即可;

默认情况下设置包含这些: TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.auth', 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', )

【上面的默认设置是 1.6 版本的,1.7 之后默认值发生了变化(如下),具体请参见文档】

TEMPLATE_CONTEXT_PROCESSORS = ( "django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.static", "django.core.context_processors.tz", "django.contrib.messages.context_processors.messages", )

后记: 首先,上面这段代码在 settings.py 里面是没有的,但是我们可以在里面加入这些内容; 其次,1.6 版本默认了更多,具体可以查看 TEMPLATE_CONTEXT_PROCESSORS,对于整个 RequestContext 的配置可以参见:subclassing-context-requestcontext 第三,到如果要 render_to_response 的时候,不需要用 context_instance= 的明明参数传递进去(也可以用),可以直接在第三个位置参数里面传入 RequestContext(request) 即可。 第四,那个 request.REMOTE_ADDR 是取不到的,应该用 request.META.REMOTE_ADDR 这样才可以看到。 所以这些样例一直实验不成功。。好生郁闷。。

一一介绍:

a. django.core.context_processors.auth

包含如下变量: user: 一个 django.contrib.auth.models.User 实例,描述了当前登录用户(或者一个 AnonymousUser 实例,如果客户端没有登录)。 messages :一个当前登录用户的消息列表(字符串)。 在后台,对每一个请求,这个变量都调用 request.user.get_and_delete_messages() 方法。 这个方法收集用户的消息然后把它们从数据库中删除。 perms : django.core.context_processors.PermWrapper 的一个实例,包含了当前登录用户有哪些权限。

b. django.core.context_processors.debug

debug: 布尔值,用于测试是否处于调试模式; sql_queries: 列表,包含了最近的查询统计(包括语句以及耗时等); * 由于调试信息比较敏感,所以这个context处理器只有当同时满足下面两个条件的时候才有效: – DEBUG 参数设置为 True 。 – 请求的ip应该包含在 INTERNAL_IPS 的设置里面。

c. django.core.context_processors.i18n

LANGUAGES: LANGUAGES 选项的值。 LANGUAGE_CODE: 如果 request.LANGUAGE_CODE 存在,就等于它;否则,等同于 LANGUAGE_CODE 设置。


【转载请附】愿以此功德,回向 >>

原文链接:http://www.huangwenchao.com.cn/2014/02/django08.html【Django 学习笔记 (VIII)】

发表评论

邮箱地址不会被公开。 必填项已用*标注