模板层
模板,其实就是一个HTML页面,我们只不过是,通过一些标签对其进行数据的渲染最终展示给用户的内容。而对于模板层,我们主要的精力不在HTML上,而是在标签上
变量
视图传递给模板的数据,可以是一个数据,也可以是一个对象
def start(request):
title = "欢迎学习django"
lists = [1, 2, 3]
return render(request, 'userInfo\\add_user.html', {'title': title, 'list': lists})
遵守标识符规则
语法:{{var}} -> {{num}}
注意:如果使用的变量不存在,则插入的是空字符串。
在模板中使用 . 语法
{{stu.name}}: 使用.语法,要是字典类型,或者是对象中的属性或者方法
在模板中调用方法:{{stu.getName}}
注意,在模板中调用方法,不能传递参数。
标签
语法:{% tag %}
if标签:逻辑判断语句
在输出中用判断一些关系,来决定数据的不同处理方式
格式:
{%if 表达式 %}
语句1
{% elif 表达式 %}
语句2
{% else %}
语句3
{% endif %}
for 标签:循环语句
循环语句就是将字典或者是列表中的数据一条一条的迭代出来。
格式:
{% for 变量 in 列表 %}
语句1
{% empty %}
语句2
{% endfor %}
注意 : 列表为空或者是列表不存在的时候,执行语句2
{{ forloop.counter}}:表示循环的第几次
例:
<ul>
{% for stu in students %}
<li>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% empty %}
<li>目前没有学生</li>
{% endfor %}
</ul>
comment标签
多行注释
格式:
{% comment %}
这里是注释的内容,
不会显示在页面中,
而且可以是多行。
{% endcomment %}
ifequal/ifnotequal
判断是否相等或者不相等
格式:
{% ifequal 值1 值2 %}
语句
{% endifequal %}
{% ifnotequal 值1 值2 %}
语句1
{% endifequal %}
如果值1 和值2相等,执行语句
如果值1和值2不相等,执行语句1
include 标签
加载模板并以标签内的参数渲染
格式:
{% include '模板目录' 参数1 参数2 %}
url 标签
url标签是用来做动态url的,需要配置工程配置目录中的url中定义的namaspace以及namespace中配置的app中的url中所对应的name来进行合成url,后边的参数 p1 p2 是在URL中的参数,如果有多个,就依次用空格分开,没有就不需要写。
格式:
{% url 'namespace:name' p1 p2 %}
csrf_token 标签
用于跨站请求伪造保护的
格式:
{% csrf_token %}
此处的标签很简单,就是将原木原样的标签放入到for表单中的任意位置即可。
block/extends标签
用于模板的继承
autoescape 标签
作用于HTML转义
过滤器
在变量显示前修改它 语法{{var | 过滤器 }}
假设我在视图中返回一个字符串,都是小写字母。
def test(request):
return render(request, 'pages\test.html', {'str': 'sbc'})
r我在HTML文件中获取文件时只需要使用{{str}}即可将变量的值取出来。如果使用过滤器,取值方式如下:
<h1>{{str|upper}}</h1>
常用过滤器:power/upper/default/date/join
过滤器可以传递参数,参数用引号引起来.
join:格式:列表|join:’#’
示例:
<h1>{{list|join:’,’}}</h1>
如果一个变量没有被提供,或者值为false、空,可以使用默认值
格式:{{var|default:’没有’}}
根据给定格式转换日期为字符串
Date:格式:{{dateVal|date:’y-m-d’}}
HTML转义:escape
加减乘除:
<h2>{{num|add:-10}}</h2><h2>{% widthratio num 1 5 %}</h2># (num/1)*5
奇偶行换色
<ul>
{% for stu in students %}
{% if forloop.counter | divisibleby:2 %}
<li style='color:red'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% else %}
<li style='color:blue'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% endif %}
{% empty %}
<li>目前没有学生</li>
{% endfor %}
</ul>
注释
单行注释
{# 注释的内容 }
多行注释
{% comment %}
dfg
dfggh
gh
{% endcomment %}
反向解析
链接 此时如果url正则变了,那么所有的链接就都要修改。使用反向解析可以解决这个问题 Project下的urls
url(r’^’, include(‘app.urls’, namespace=’something’))
app下的urls文件
url(r’^good/$’,views.good. name=’good’)
页面链接
<a href=’{% url ‘something:good’%}’>
此时,无论怎么修改url正则,都不会影响页面中的任何url
模板继承
作用:模板继承可以减少页面的内容的重复定义,实现页面的重用 Block标签:在父模板中预留区域,子模板去填充
语法:{% block 标签名 %}{% endblock 标签名%}
一个模板中可以定义多个block块
Extends标签:继承模板,需要写在模板文件的第一行
语法:{% extends ‘父模板路径’ %}
示例:
定义父模板: base.html:
<body>
<div id = ‘header’></div>
<div id=‘main’>
{% block main %}
{% endblock main%}
</div>
<div id= ‘footer’></div>
</body>
定义子模板: index.html:
{% extends ‘base.html’%}
{% block main%}
<h2>you are the best!!!</h2>
{% block main%}
HTML转义
后台传过来的HTML代码字符串,如果不转义,他就会当成普通字符串渲染。
将接收到的HTML字符串解析成HTML进行渲染 {{code}} {{code|escape}} {{code|safe}} {% autoescape off %} {{code}} {% endautoescape %}
csrf跨站请求伪造
某些恶意网站包含链接、表单、按钮、js,利用登录用户在浏览器中认证从而攻击服务。 防止CSRF: 在settings.py文件中的中间件配置增加csrf的配置,默认配置好了。但是加完了,自己也登录不了了。 我们自己访问,需要在我们的表单中添加{% csrf_token %}
验证码
def verifycode(request):
# 引入绘图模块
from PIL import Image, ImageDraw, ImageFont
# 引入随机函数模块
import random
# 定义变量,用于画面的背景色、宽、高
bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100)) width = 100 height = 50
# 创建画面对象
im = Image.new('RGB',(width, height),bgcolor)
# 创建画笔对象
draw = ImageDraw.Draw(im)
# 调用画笔的point()函数绘制噪点
for i in range(0, 100):
xy = (random.randrange(0, width), random,randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
# 定义验证码的备选值
str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'
# 随机选取四个值作为验证码
rand_str = ''
for i in range(0,4):
rand_str += str[random.randrange(0, len(str))]
# 构建字体对象
font = ImageFont.truetype(r'C\Windows\Fonts\AdobeArabic-Bold.otf', 40)
# 构建字体颜色
fontcolor1 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor2 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor3 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor4 =(255, random.randrange(0, 255), random.randrange(0, 255))
# 绘制四个字
draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
# 释放画笔
del draw
# 存入session , 用于做进一步验证
request.session['verifycode'] = rand_str
# 内存文件操作
import io buf = io.BytesIO()
# 将图片保存在内存中,文件类型为png
im.safe(buf, 'png')
# 将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getValue(), 'image/png')