模板
概述:
模板由两部分组成:
HTMl代码
逻辑控制代码:
变量、标签、过滤器
作用:
很便利的生成HTML
优点:
模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用
模板处理:
加载:
根据给定的标识找到模板然后预处理,通常会将它编译好放在内存中
渲染:
使用Context数据对模板插值并返回生成的字符串
定义模板:
变量:
视图传递给模板的数据
要遵守标识符规则
语法:{{ var }}
注意:如果使用的变量不存在,则插入的是空字符串
在模板中使用点语法:
字典查询
属性或方法
数字索引
在模板中调用对象的方法:
注意:
不能传递参数
标签:
语法:{% tag %}
作用:
在输出中创建文本
控制逻辑和循环控制
if:格式:
{ % if 表达式 % }
语句
{ % endif % }
{ % if 表达式 % }
语句1
{ % else % }
语句2
{ % endif % }
{ % if 表达式1 % }
语句1
{ % elif 表达式2 % }
语句2
. . .
{ % else % }
语句n
{ % endif % }
for:
格式:
{ % for 变量 in 列表 % }
语句
{ % endfor % }
{ % for 变量 in 列表 % }
语句1
{ % empty % }
语句2
{ % endfor % }
{ { forloop. counter} }
comment:
作用:注释多行
语法:
{ % comment % }
注释内容
{ % endcomment % }
ifequal/ifnotequal:
作用:判断相等或不相等
格式:
{ % ifequal 值1 值2 % }
语句
{ % endifequal% }
{ % ifnotequal 值1 值2 % }
语句
{ % endifnotequal% }
include:
作用:加载模板并以标签内的参数渲染
格式:{% include '模板目录' 参数1 参数2 %}
url:
作用:反向解析
格式:{% url'namespace:name' p1 p2 %}
csrf_token:
作用:用于跨站请求伪造保护
格式:{% csrf_token %}
block、extends:
作用:用户模板的继承
autoescape:
作用:用于HTML转义
过滤器:
语法:{{ var|过滤器 }}
作用:在变量被显示前,修改
lower
upper
过滤器可以传递参数,参数用引号引起来:
join:格式:列表|join:‘#’
示例:<h1> {{ list|join:'#' }} </h1>
如果一个变量没有被提供,或值为false、空,可以使用默认值:
default:格式:{{ var|default:'price' }}
示例:<h1> {{ text|default:'空' }} </h1>
根据给定格式转换为字符串:
date:格式:{{ date|date:'y-m-d' }}
HTML转义:
escape
判断奇数偶数:
{ % if forloop. counter| divisibleby: 2 % }
语句1
{ % else % }
语句2
{ % endif % }
加减乘除:
{ { num| add: price } }
{ { num| add: - price } }
< ( num/ n1) * n2 >
{ % widthradio price n1 n2 % }
{ % widthradio price n1 n2 % }
注释:
单行注释:
语法:{# #}
多行注释:
见‘comment’过滤器
反向解析:
re_path( r'^' , include( ( 'myApp.urls' , 'myApp' ) , namespace= "myApp" ) )
url( r'^login/$' , views. login, name= "login" )
< a href= "{% url 'myApp:login' %}" > 点击< / a>
模板继承:
作用:
可以减少页面的内容的重复定义,实现页面重用
block标签:
在父模板中预留区域,子模板去填充
语法:
{% block 标签名 %}
{% endblock 标签名 %}
extends标签:
继承模板,需要写在模板文件第一行
语法:
{% extends ‘父模板路径’ %}
示例:
< h1> 头部< / h1>
{ % block main % }
{ % endblock main % }
< h1> 尾部< / h1>
{ % extends 'myApp/base.html' % }
{ % block main % }
< h1> 我是中间部分< / h1>
{ % endblock main % }
HTML转义:
问题:会把HTML代码直接当成字符串原样输出
解决:
{ { code| safe} }
或
{ % autoescape off % }
{ { code} }
{ % endautoescape % }
CSRF:
跨站请求伪造:
某些恶意网站包含链接、表单、按钮、js,利用登录用户在浏览器认证,从而攻击服务
防止CSRF:
在settings.py中的MIDDLEWARE下加入< 'django.middleware.csrf.CsrfViewMiddleware', >
{% csrf_token %}:这个要隐藏在HTML页面中,避免被破解,从而攻击服务器
验证码:
作用:
在用户注册、登录页面的时候使用,为了防止暴力请求,减轻服务器的压力, 也是防止CSRF的一种方式