模板
概述
模板由两部分组成:HTML代码 + 逻辑控制代码(变量 + 标签 + 过滤器)
作用:很便利的生成HTML页面
优点:实现了业务逻辑与显示内容的分离,一个视图可以任意使用模板,一个模板可以供多个视图使用
模板处理:
- 加载:根据制定的规则找到对应的模板,然后预处理,编译后存在内存中
- 渲染:用给定的context内容数据填充加载的内容,并生产新的HTML页面(字符串)
定义模板
变量:
- 语法:{{ var }}
- 注意:变量名要遵循标识符规则,如果使用的变量不存在,则插入空字符串
- 示例:
Nice day
{{ sentence }} - 在模板中使用 . 语法访问对象的属性
- 在模板中调用对象的方法:不能传递参数
{{ stu.say }} # 这里的say是个无参函数
标签:
- 语法:{% tag %}
- 作用:控制逻辑
- if:判断
{% if num %}
Nice
{% endif %} - for:循环
{% for stu in students %}
- stu.sname
- {% empty %}
- 无数据
- {% endfor %}
- comment:注释
{% comment %}
Hi
Hello
{% endcomment %} - ifequal、ifnotequal:等于、不等于
{% ifequal num 10 %}
Hi
{% endifequal %} - include:包含
# 作用:加载模板并以标签内的参数渲染
# 格式:{% include ‘模板目录’ with 参数1 = 参数2 %} - url:反向解析
{% url ‘namespace:name’ p1 p2 %} - csrf_token:跨站请求伪造保护
{% csrf_token %} # 启动post请求功能
账号:
- block、extends:模板继承
- autoescapr:用于HTML转义
过滤器:
- 语法:{{ 变量 | 过滤器 }}
- 作用:在变量被显示之前修改它
- lower:转小写
- upper:转大写
- join:
# 格式:list | join:参数
# 示例:{{ str | join:’#’}} - default:如果使用的变量不存在,或者为空、False,则使用默认值,否则使用变量的值
# 格式:var | default:参数
# 示例:{{ num | default:’这是个False哟~’}} - date:根据给定格式对一个变量进行格式化显示,格式:var | date:’Y-m-d’
- escape:开启HTML转义
- 加减乘除
{{ num }}
{{ num | add:5}}
{{ num | add:-5}}
{% widthratio num 1 5 %}
{% widthratio num 5 1 %} 注释
# 单行注释:
{# 一行的内容 #}# 多行注释(可以包含任何代码): {% comment %} ... {% endcomment %}
模板继承:
- 作用:可以减少页面内容的重复定义,实现页面内容的重用
- block标签:在父模板中预留位置,让子模版填充
- extends标签:继承,写在模板文件的第一行
- 示例:
# 定义模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<div id="box">
{% block main%}
{% endblock main %}
</div>
<hr>
<div id="temp">
{% block temp %}
{% endblock temp %}
</div>
</body>
</html>
# 定义子模版
{% extends 'base.html' %}
{% block main %}
<h1>Nice nice</h1>
{% endblock main %}
{% block temp %}
<h1>Lalala</h1>
{% endblock temp %}
HTML转义:
- 问题:用户输入script标签,会当成js代码来处理,对页面造成影响
- 默认是开启自动转义,所接收的内容当成字符串处理
- 关闭转义
{% autoescape off %}
{{ code }}
{% endescape %} - 注意:如果在父模板中关闭了自动转义,在其子模版中也是关闭的
CSRF:
模拟用户的cookie发起请求(暂未说详细)
验证码:
- 作用:在用户注册、登陆页面为了防止暴力请求,减轻服务器的压力;防止CSRF的方法