- template是基于文本格式的文件(html文件也是文本格式),包含如下一些关键字:
- variables:当template被evaluated时,variable会被替换成相应的值,variable在模板中的格式:{{variable}},如果variable不存在,模板会使用TEMPLATE_STRING_IF_INVALID设置的值替换变量,默认是‘’.template中方法调用也是变量的一种,如{{blog.entry_set.all.count}},注意方法做变量时没办法传递参数,所以只能是无参方法作变量
- filters:用于修改variable,‘|’称为管道符,对变量应用filter,如{{name|low}},其中low就是一个filter,filter还可以有参数,也可以自定义filter。django中大概有三十种filter,常用的有:
- default:如果变量是false或者空,使用default值替换variable,{{value|default:”nothing”}},default的值默认不转义
- length:获取变量的长度,{{value|length}}
- striptags:除去html标签,{{value|striptags}}:value中含有标签时,标签会被删除只返回value的剩余部分
- escape:转义字符串中的html标签
- safe:使变量输出不会进行html转义,如果设置了自动转义关闭,这个filter就会失效
- comments:用于模板中注释,格式{##},注释中也可包含代码,{# {%if foo%}bar{%else%} #},模板evaluated时会正常执行
- tags:控制template的逻辑,格式{% tag %},部分tag还要有{% endtag %},django自带大约二十多个tag,常用的如下:
- for:用于数组循环
for example
- if,elif,和else:
if example
- block和extends:模板继承时使用,block表示可以在子模板中改写的块,同一模板中的block名字不能相同,extends表示用于继承父模板
- for:用于数组循环
- 模板继承:
- 继承模板使用{% extends %},并且它必须是子模板中第一个tag
- 推荐在base template中多使用{% block %}
- 如果多个模板中有重复内容,则考虑将内容移到base template中的{% block %}下
- 如果要在子模板的{%block%}中访问父模板的block内容可以使用{{block.super}}
- Django模板中默认开启了对用于输出的变量的html转义,如果要关闭转义功能,可以在变量,模板,site三个级别设置关闭
关闭转义
- Context 类:传递给模板,作用是替换模板中的变量。Context对象是个stack,所以包含push和pop方法,构造函数中可以包含两个参数:
- 一个字典型,用于映射变量名和变量值
- 当前application的名字,当url有命名空间时有用
Context
- RequestContext:Context的子类,其与Context有两个不同:
- 第一个参数是HttpRequest对象
- 会调用TEMPLATE_CONTEXT_PROCESSOR中的processor依次往RequestContext中加入一些预定义变量,自己也可以定义额外的processor再添加其他内容到RequestContext中
RequestContext processor
- 使用模板通常有两个步骤:
- compile模板存到一个对象中.模板只编译一次
- 调用模板对象的render方法,参数是context
Template example
- variable lookup:变量名中可以包含点,当点出现时,以{{foo.bar}}为例它的解析顺序为:
- dictionary lookup,如foo[“bar”]
- attribute lookup,如foo.bar
- list-index lookup,如foo[bar]
- method lookup
Variable lookup
- method lookup时,注意以下几点:
- 调用方法抛出异常时,如果异常类型设置了”静态属性”silent_variable_failure=true,则变量会被替换为空,否则会替换为异常信息
- 如果方法含有参数,则变量会被替换为空
- 在模板中调用某些方法会产生负面影响如model.delete().为了防止这种情况可以设置alters_data=true.这样方法不会被调用,而是用TEMPLATE_STRING_IF_INVALID替换变量的值。model.delete方法的alters_data默认为true