1. 模板介绍
1.1 模板的功能
产生 html, 控制页面上展示的内容. 模板文件不仅仅是一个 HTML 文件.
模板文件包含两部分内容:
静态内容: CSS,JS,HTML.
动态内容: 用于动态去产生一些页面内容. 通过模板语言来产生.
1.2 模板文件的使用
通常是在视图函数中使用模板产生 HTML 内容返回给客户端.
加载模板文件 loader.get_template, 获取模板文件的内容, 产生一个模板对象.
定义模板上下文 RequeseContext, 给模板文件传递数据.
模板渲染产生 HTML 页面内容 render, 用传递的数据替换相应的变量, 产生一个替换后的标准的 HTML 内容.
1.3 模板文件加载顺序
首先去配置的模板目录下面去找模板文件.
去 INSTALLED_APPS 下面的每个应用的 templates 去找模板文件, 前提是应用中必须有 templates 文件夹.
2. 模板语言
2.1 变量
模板变量的作用是计算并输出, 变量名必须由字母, 数字, 下划线 (不能以下划线开头) 和点组成.
语法如下:
{{变量}}
当模版引擎遇到点如 book.title, 会按照下列顺序解析:
1. 字典 book['title']
2. 先属性后方法, 将 book 当作对象, 查找属性 title, 如果没有再查找方法 title()
3. 如果是格式为 book.0 则解析为列表 book[0]
如果变量不存在则插入空字符串''.
在模板中调用方法时不能传递参数.
例如:
{{book.btitile}}
首先把 book 当成一个字典, 把 btitle 当成键名, 进行取值 book['btitle'].
把 book 当成一个对象, 把 btitle 当成属性, 进行取值 book.btitle.
把 book 当成一个对象, 把 btitle 当成对象的方法, 进行取值 book.btitle.
例如:
{{book.0}}
首先把 book 当成一个字典, 把 0 当成键名, 进行取值 book[0].
把 book 当成一个列表, 把 0 当成下标, 进行取值 book[0].
如果解析失败, 则产出内容时用空字符串填充模板变量.
使用模板变量时, 前面的困难是一个字典, 可能是一个对象, 还可能是一个列表.
2.2 标签
语法如下:
{% 代码段 %}
for 标签语法如下:
{%for item in 列表 %}
循环逻辑
{{forloop.counter}}表示当前是第几次循环, 从 1 开始
{%empty%}
列表为空或不存在时执行此逻辑
{%endfor%}
if 标签语法如下:
{%if ...%}
逻辑 1
{%elif ...%}
逻辑 2
{%else%}
逻辑 3
{%endif%}
比较运算符如下:
运算符左右两端不能紧挨变量或常量, 必须有空格.
== != <> <=>=
布尔运算符如下:
and or not
2.3 过滤器
语法如下:
使用管道符号 | 来应用过滤器, 用于进行计算, 转换操作, 可以使用在变量, 标签中.
如果过滤器需要参数, 则使用冒号: 传递参数.
变量 | 过滤器: 参数
长度 length, 返回字符串包含字符的个数, 或列表, 元组, 字典的元素个数.
默认值 default, 如果变量不存在时则返回默认值.
data|default:'默认值'
日期 date, 用于对日期类型的值进行字符串格式化, 常用的格式化字符如下:
Y 表示年, 格式为 4 位, y 表示两位的年.
m 表示月, 格式为 01,02,12 等.
d 表示日, 格式为 01,02 等.
j 表示日, 格式为 1,2 等.
H 表示时, 24 进制, h 表示 12 进制的时.
i 表示分, 为 0-59.
s 表示秒, 为 0-59.
value|date:"Y 年 m 月 j 日 H 时 i 分 s 秒"
2.4 注释
在模板中使用如下模板注释, 这段代码不会被编译, 不会输出到客户端; HTML 注释只能注释 HTML 内容, 不能注释模板语言.
单行注释语法如下:
{#...#}
注释可以包含任何模版代码, 有效的或者无效的都可以.
{# { % if foo % }bar{ % else % } #}
多行注释使用 comment 标签, 语法如下:
- {
- %comment%
- }
- ...
- {
- %endcomment%
- }
3. 模板继承
模板继承和类的继承含义是一样的, 主要是为了提高代码重用, 减轻开发人员的工作量.
典型应用: 网站的头部, 尾部信息.
3.1 父模板
如果发现在多个模板中某些内容相同, 那就应该把这段内容定义到父模板中.
标签 block: 用于在父模板中预留区域, 留给子模板填充差异性的内容, 名字不能相同. 为了更好的可读性, 建议给 endblock 标签写上名字, 这个名字与对应的 block 名字相同. 父模板中也可以使用上下文中传递过来的数据.
{%block 名称 %}
预留区域, 可以编写默认内容, 也可以没有默认内容
{%endblock 名称 %}
3.2 子模板
标签 extends: 继承, 写在子模板文件的第一行.
{% extends "父模板路径"%}
子模版不用填充父模版中的所有预留区域, 如果子模版没有填充, 则使用父模版定义的默认值.
填充父模板中指定名称的预留区域.
{%block 名称 %}
实际填充内容
{{block.super}}用于获取父模板中 block 的内容
{%endblock 名称 %}
4. HTML 转义
模板对所有传递的文字进行输出时, 合并以下字符自动转义.
小于号<转换为 <
大于号> 转换为 >
单引号' 转换为 '
双引号 " 转换为 "
与符号 & 转换为 &
过滤器 escape 可以实现对变量的 HTML 转义, 默认模板就会转义, 一般省略.
{{t1|escape}}
过滤器 safe: 局部转义, 告诉模板这个变量是安全的, 可以解释执行.
{{data|safe}}
标签 autoescape: 设置一段代码都局部转义, 接受 on,off 参数.
- {
- %autoescape off%
- }
- ...
- {
- %endautoescape%
- }
模板硬编码中的字符串默认不会经过转义, 如果需要转义, 那需要手动进行转义.
Django 框架(十一): 模板介绍, 模板语言, 模板继承, HTML 转义
来源: http://www.bubuko.com/infodetail-3394508.html