django1.8读书笔记模版高级进阶
一、概述
想要定制或者扩展模版引擎,模版系统工作原理,自动转移特征
名词解析:模板 渲染 就是是通过从context获取值来替换模板中变量并执行所有的模板标签。
二、Context处理器
如果在模版中经常使用相同的模版变量,这是会产生大量的代码冗余,可以通过RequestContext来解决这个问题。
例如:
from django.template import loader, Context def view_1(request):
# ...
t = loader.get_template('template1.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am view 1.'
})
return t.render(c) def view_2(request):
# ...
t = loader.get_template('template2.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am the second view.'
})
return t.render(c)
有相同的'app','user','ip_address',我们可以通过RequestContext来解决,第一个参数:视图函数传进来的request对象,第二个参数:额外的需要渲染的模版变量,第三个参数:可选参数processors是一个context处理器列表或元组。context处理器是一个函数,返回一个模版Context变量字典。
from django.template import loader, RequestContext def custom_proc(request):
"A context processor that provides 'app', 'user' and 'ip_address'."
return {
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR']
} def view_1(request):
# ...
t = loader.get_template('template1.html')
c = RequestContext(request, {'message': 'I am view 1.'},
processors=[custom_proc])
return t.render(c) def view_2(request):
# ...
t = loader.get_template('template2.html')
c = RequestContext(request, {'message': 'I am the second view.'},
processors=[custom_proc])
return t.render(c)
三、Django提供了 全局 context处理器的支持
TEMPLATE_CONTEXT_PROCESSORS 指定了哪些context processors总是默认被使用。这样就省去了每次使用 RequestContext 都指定 processors 的麻烦。在setting文件中可以找到
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
)
每一项都是可调用函数,跟上面的custom_proc 有相同的接口。向其中添加的context处理器函数路径,都应该包含在系统path的搜索路径。
每个处理器将会按照顺序应用。 也就是说如果你在第一个处理器里面向context添加了一个变量,而第二个处理器添加了同样名字的变量,那么第二个将会覆盖第一个。
写Context处理器的一些建议
- 使每个context处理器完成尽可能小的功能。 使用多个处理器是很容易的,所以你可以根据逻辑块来分解功能以便将来复用。 
- 要注意 TEMPLATE_CONTEXT_PROCESSORS 里的context processor 将会在基于这个settings.py的每个 模板中有效,所以变量的命名不要和模板的变量冲突。 变量名是大小写敏感的,所以processor的变量全用大写是个不错的主意。 
- 不论它们存放在哪个物理路径下,只要在你的Python搜索路径中,你就可以在TEMPLATE_CONTEXT_PROCESSORS 设置里指向它们。 建议你把它们放在应用或者工程目录下名为context_processors.py 的文件里。 
四、html自动转意,django里默认情况下,每一个模板自动转意每一个变量标签的输出。主要是解决用户提交的数据不应该完全被信任,有可能是有恶意用途的字符串
比如:用户输入了<script>alert('hello')</script>,如果将这个字符串直接显示,将会弹出一个警告框。而不是输入用户的名字。
如果你不想数据被自动转意,在每一站点级别、每一模板级别或者每一变量级别你都有几种方法来关闭它
对于单独的变量
用safe过滤器为单独的变量关闭自动转意:
This will be escaped: {{ data }}
This will not be escaped: {{ data|safe }}
对于模板块
为了控制模板的自动转意,用标签autoescape来包装整个模板(或者模板中常用的部分),autoescape 标签有两个参数on和off 。就像这样:
Auto-escaping is on by default. Hello {{ name }}
{% autoescape off %}
    This will not be auto-escaped: {{ data }}.
    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}
五、加载模版的方法
django.template.loaders.filesystem.load_template_source : 这个加载器根据 TEMPLATE_DIRS 的设置从文件系统加载模板。它默认是可用的。
django.template.loaders.app_directories.load_template_source : 这个加 载器从文件系统上的Django应用中加载模板。 对 INSTALLED_APPS 中的每个应用,这个加载器会查找templates 子目录。 如果这个目录存在,Django就在那里寻找模板。这个加载器默认启用。
django1.8读书笔记模版高级进阶的更多相关文章
- django1.8读书笔记模型高级进阶
		一.访问外键和多对多值 例如:模型类定义如下 from django.db import models class Publisher(models.Model): name = models.Cha ... 
- 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图
		读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺 ... 
- Django笔记 —— 模型高级进阶
		最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ... 
- Django笔记 —— 模板高级进阶
		最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ... 
- django1.8forms读书笔记
		一.HttpRequest对象的一些属性或方法 request.path,The full path, not including the domain but including the leadi ... 
- R语言实战读书笔记(五)高级数据管理
		5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 sig ... 
- django1.6读书笔记一
		reporter是Article中的一个外键,我们可以有多篇文章指向同一个reporter,然后通过使用article_set.all()就可以返回其所有的headline了,也可以添加条件来筛选. ... 
- 读书笔记-JavaScript高级程序设计(1)
		1.组合继承 (JavaScript 中最常用的继承模式 ) (position: page168) (书中定义了两个变量名 SuperType SubType 乍一看 感觉不太能区分,我将改为 ... 
- 读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3
		Node类型的变化 访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px& ... 
随机推荐
- 剑指offer面试题12-打印1到最大的n位数
			题目: 输入一个数字n,按顺序打印出从1最大的n位十进制数.比方输入3,则打印出1.2.3最大的三位数即999 这道题的主要陷阱就在大数的处理,仅仅要将这个考虑进去,用字符串来表示.就好说了. 那差点 ... 
- Spring+DBUnit+H2----项目单元测试
			http://yugouai.iteye.com/blog/1879337 今天够郁闷的,早上调好的代码,到中午调试不同了,分析不出问题,H2的JDBC报错:org.h2.jdbc.JdbcSQLEx ... 
- Discuz常见大问题-如何开启和使用首页四格
			在论坛-首页四格中,勾选开启首页四格,然后可以选择数据来源的板块 注意首页四格刷新是有时间的,5分钟左右,不是你这里更新完了帖子那里就有了(如果你自己建的网站,可能回复和热帖都还没有) 当然你也可以使 ... 
- MyEclipse开发Rest服务入门
			MyEclipse支持Rest服务,开发起来非常方便,下面我就举一个计算机的例子: 实现功能:加.减.乘.除: 效果如下: Rest服务要点:每个服务或任何东西都有一个URI: 步骤1:创建Web S ... 
- redis 配置步骤
			1.下载 2.启动 3.持久化(快照和AOF) 4.主从配置(集群) 5.读写分离 6.自动切换主从 7.哨兵服务(集群) 8.集群锁 9.Session共享 
- WebStorm配置
			一.主题配色 主题设置方法:File -> Settings -> Appearance & Behavior -> Appearance ->Theme. webst ... 
- sqlserver varchar转datate 加计算
			SELECT * from mconsumeinfo mo where CONVERT(Datetime, mo.financedate, 120)> dateadd(day,-180,getd ... 
- tracteroute路由追踪
			traceroute 跟踪数据包到达网络主机所经过的路由工具: 是用来发出数据包的主机到目标主机之间所经过的网关的工具.traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主 ... 
- 实践:由0到1-无线大数据UX团队的成长
			背景 大数据产品的在项目成立之初,采用的是模仿原有网优工具的方式做UI设计,由BA主导画草图.手绘线框图.excel制作,更有直接打开参考产品做原型的方式,没有统一的设计和规范可言.随着团队逐渐增多. ... 
- PHP一些优先级的问题
			直接看代码 <?php echo '1'.print(2)+3,"\n"; 不错,就是这么简单,但是很少有人能正确回答 我们执行一下 [root@localhost test ... 
