模板的定义:
(1)变量:视图传递给模板的数据
变量要遵守标识符规则 {{var}}
注意:1.如果使用的变量不存在,则插入的是空字符串
2. 在模板中使用点语法:当做字典来处理或属性方法 {{stu.name}}
3. 在模板中使用对象的方法 注意:不能传递参数
(2)标签
语法:{% tag %}
作用:在输出中创建文本,控制逻辑和循环
1)if: 格式:{% if 表达式%}语句{%endif%} 或 {% if 表达式1%}语句1{%elif 表达式2%}语句2{%endif%}
2)For:格式
①{%for 变量 in 列表%}语句{%endfor%}
②{%for 变量 in 列表%}语句{%empty%}语句2{%endfor%} (列表为空,或者列表不存在时候执行语句2)
③{{forloop.counter}}:表示当前是第几次循环
实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生列表</h1>
<ul>
{%for student in students%}
<li>
{{forloop.counter}}--{{student.sname}}--{{student.scontend}}
</li>
{% empty %}
<li>目前没有学生</li>
{%endfor%}
</ul>
</body>
</html>
3)Comment
格式:{% comment %}注释的内容{% endcomment %}
作用:注释多行
4)ifequal/ifnotequal
跟if相似,作用:判断是否相等/是否不相等
格式:{% ifequal 值1 值2%}语句{% endifequal %} 解释:如果值1等于值2,则执行语句。
5)include:加载模板并以标签内的参数渲染
格式:{% include ‘模板目录’ 参数1 参数2%}
6)url:反向解析
格式:{% url ‘namespace:name’ p1 p2 %}
7)csrf_token
作用:用于跨站请求伪造保护
格式:{% csrf_token %}
8)block extends:用于模板的继承
9)autoescape:用于html转义
(3)过滤器:
语法:{{ var|过滤器 }}
作用:在变量在显示前修改它
示例:views.py中
def students(request):
studentsList = Students.objects.all()
return render(request,'myApp/students.html',{"students":studentsList,'str':'good man'})
传入一个字符串str
Students.html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生列表</h1>
<ul>
{%for student in students%}
<li>
{{forloop.counter}}--{{student.sname}}--{{student.scontend}}
</li>
{% empty %}
<li>目前没有学生</li>
{%endfor%}
</ul>
<h1>{{str|upper}}</h1>
</body>
</html>
当前的意思是将str中的字符变成大写,并非修改字符的本身
相当于重新拿了在生成以便
过滤器都有:lower(小写),upper(大写)
过滤器可以传递参数,参数用引号引起来
(3) join:格式:{{列表|join:’#’}}
实例:views.py中
def students(request):
studentsList = Students.objects.all()
return render(request,'myApp/students.html',{"students":studentsList,'str':'good man','list':['good','nice','handsome']})
Students.html中加入:
<h1>{{list|join:'#'}}</h1>
结果:good#nice#handsome
如果一个变量没有被提供,或者值为False,空,可以使用默认值:
default:格式:{{var|default:’good’}}
实例:<h1>{{test|default:'没有'}}</h1>
*日期:根据给定格式转换日期为字符串:date
格式:{{dateVal|date:’y-m-d’}}
*HTML转义:escape
*加减乘除:
<h1>num = {{num|add:10}}</h1> <!--加10-->
<h1>num = {{num|add:-5}}</h1> <!--减5-->
<h1>num = {% widthratio num 1 5 %}</h1> <!--乘以5-->
<h1>num = {% widthratio num 2 1 %}</h1> <!--除以2-->
实例:若要将奇偶行不同颜色
<ul>
{%for student in students%}
{%if forloop.counter|divisibleby:2%}
<li style="color:red">
{{forloop.counter}}--{{student.sname}}--{{student.scontend}}
</li>
{%else%}
<li style="color:blue">
{{forloop.counter}}--{{student.sname}}--{{student.scontend}}
</li>
{%endif%}
{% empty %}
<li>目前没有学生</li>
{%endfor%}
</ul>
(4)注释
1)单行注释
{#内容#}
2)多行注释
<!--内容-->
模板继承
可以减少页面的内容的重复定义,实现页面的重用
block标签:在模板中预留区域,子模板去填充
用法:{% block 标签名 %}
{% endblock 标签名 %}
extends标签:继承模板,需要写在模板文件的第一行
用法:{% extends 父模板路径 %}
示例:
Base.html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#header{
width: 100%;
height: 100px;
background-color: red;
}
#footer{
width: 100%;
height: 100px;
background-color: blue;
}
</style>
</head>
<body>
<div id="header">header</div>
<div id="main">
{% block main%}
{% endblock main%}
</div>
<div id="footer">footer</div>
</body>
</html>
Main2.html页面中
{% extends 'myApp/base.html'%}
{% block main %}
<h1>Good job!</h1>
{% endblock main %}
结果:
HTML转义
在函数中传入<h1> sunck is a good man!</h1>
页面中照样显示<h1> sunck is a good man!</h1>
按字符串传入
解决:要传入的字符当做HTML代码处理
普通传入{{code}}
转义传入{{code|safe}}
解决大量的转义:off为转义,on为不转义
{% autoescape off %}
{{code}}
{% endautoescape %}
CSRF
跨站请求伪造:某些恶意的网站包含链接、表单、按钮、js,利用登录用户在浏览器中认证,从而攻击服务(例子,不同源的POST提交表单,访问数据库造成恶意攻击)
防止CSRF:
①在setting.py文件中的MIDDLEWARE中增加:'django.middleware.csrf.CsrfViewMiddleware'
(但是在此同时也会讲自己给封掉)
②在表单里面加上{% csrf_token %} 但没有绝对的安全 (在此就自己就可以访问)