"""
******模版******
--定义模版--
**变量**
视图传递给模版的数据
注意1:要遵守标识符规则
语法:{{var(即变量)}}
如果使用的变量不存在,则插入的是空字符串
在模版中使用点的语法,
1.先当字典查询来处理
2.属性或者方法
3.数字索引
举例:
VIEWS中定义如下:
def index11(request):
student = Students.objects.get(pk=1)
return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.sname }}</h1>
在模版中调用对象的方法:
1.在models中定义一个方法
def getName(self):
return self.sname
2.views中定义如下:
def index11(request):
student = Students.objects.get(pk=1)
return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.getName }}</h1>
注意:模版不能传递附加的参数
在models中定义一个方法如下,以下这样的方式是不可以的
def getName(self,str):
return self.sname+str
**标签**
语法:{% tag %}
作用:
1.在输出中创建文本
2.控制逻辑和循环
if
格式1:
{% if 表达式 %}
语句
{% endif %}
格式2:
{% if 表达式1 %}
语句1
{% else %}
语句2
{% endif %}
格式3:
{% if 表达式1 %}
语句1
{% elif 表达式2%}
语句n
{% else %} #这个可有可无
语句e
{% endif %}
示例:
{% if num %}
<h1>hello world</h1>
{% endif %}
for
格式1:
{% for 变量 in 列表 %}
语句1
{% empty %} #这个可有可无,这个是列表为空或者列表不存在,执行语句2
语句2
{% endfor %}
格式2:
{% for 变量 in 列表 %}
语句1
{% endfor %}
格式3:
{{forloop.counter}} #表示当前是第几循环
示例1:
{% for line in studdd %}
<li>{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% empty %}
<li>目前没有学生</li>
{% endfor %}
示例2:
{% for line in stud %}
{% if forloop.counter|divisibleby:2 %}
<li style="color:red">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% else %}
<li style="color:blue">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% endif %}
{% empty %}
<li>目前没有学生</li>
{% endfor %}
comment
作用:注释多行,不紧可以注释标签,也可以注意变量
格式:
{% comment%}
<h1>学生</h1>
{{stu.student}}
{%endcomment%}
单行注释用: {# 注释内容 #}
ifequal/ifnotequal
作用:判断是否相等或者不相等
格式:
{% ifequal 值1 值2%} #如果值1与值2相等就执行下面的语句,不相等就不执行
语句
{% endifequal %}
示例:
{% ifequal 'ok' 'ok' %}
<h1>学生要加油</h1>
{% endifequal %}
include
作用:加载模版并以标签内容的参数渲染
格式:{% include '模版目录' 参数1 参数2 %}
url
作用:反向解析
格式:{% url 'namespacename' p1 p2 %}
主url
urlpatterns = [
# path('admin/', admin.site.urls),
url(r'^',include('users.urls',namespace='app')),
]
次url
app_name ='app3'
urlpatterns = [
url(r'^food/(\d+)/(\d+)/$', views.good,name='good'),
]
视图views
def good(request,id,id3):
return render(request,'users/good.html',{'num':id,'num3':id3})
html中
<a href="{% url 'app:good' 5 3%}">跳转</a>
跳转到good.html
<h1>{{ num }}</h1>
<h1>{{ num3 }}</h1>
csrf_token
作用:用于跨站请求伪造保护
某些网站包含链接、表单、按钮、JS会利用我们登陆的用户在浏览器中认证,从而攻击服务
防止csrf有两种方法
第一种:
1.在setting中MIDDLEWARE里加上'django.middleware.csrf.CsrfViewMiddleware',
2.在表单中{% csrf_token %}
第二种:
验证码:在用户注册,登陆页面时候使用,为了防止暴力请求,减轻服务器的压力,防止CRSF一种方式!
1.安装pillow模块
2.在views中配置一个def ,如下代码,用于生成图片验证码的函数
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse
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 = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
#随机选取4个值作为验证码
rand_str = ''
for i in range(0,4):
rand_str += str[random.randrange(0,len(str))]
#构造字体对象 把C盘的字体文件放到其它盘,因为C盘字体文件路径不好找
font = ImageFont.truetype("E:\simsunb.ttf", 36)
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))
#绘制4个字
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
# request.session['verifycode'] = rand_str
#内存文件操作
import io
buf = io.BytesIO()
#将图片保存在内存中,文件类型为png
im.save(buf,'png')
#将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getvalue(),'image/png')
#备注:
# code1 = request.session['verify'] 【登录获取图片上的验证码】
#code2 = request.POST.get('verifycode') 【获取登录表单上输入的验证码】
3.配置url
url(r'^verifycode/$',views.verifycode),
url(r'^verifycodefile/$',views.verifycodefile),
url(r'^verifycodecheck/$',views.verifycodecheck),
4.创建html
<body>
<form action="/verifycodecheck/" method="post">
{% csrf_token %}
<input type="text" name="yanzheng" />
<img src="/verifycode/">
<input type="submit" value="登陆" />
<span>{{ flag }}</span>
</form>
</body>
5.再次配置views
from django.shortcuts import redirect
def verifycodefile(request):
ff = request.session.get('shibai',True)
str = ''
request.session.clear()
if ff == False:
str = "验证码输入错误,请重新输入"
return render(request,'users/verifycodefile.html',{'flag':str})
def verifycodecheck(request):
code1 = request.POST.get('yanzheng').upper()
code2 = request.session['verifycode'].upper()
print(code1,code2)
if code1 == code2:
request.session.clear()
return render(request,'users/succese.html')
else:
request.session['shibai']= False
return redirect('/verifycodefile/')
模版继承
作用:模版继承可以减少页面内容的重复定义,实现页面的重用
block标签 在父模版中预留区域,子模版去填充
语法:
{% block 标签名 %}
{% endblock 标签名 %}
父模版:
<!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 %}
<hr/>
{% block main2%}
{% endblock main2 %}
</div>
<div id = "footer">footer</div>
</body>
</html>
extends标签 继承模版,需要写在模版文件的第一行
语法:
{% extends 'users/base.html' %}
{% block main %}
<h1>ok,my</h1>
{% endblock main %}
{% block main2 %}
<h1>suck,is kaige</h1>
{% endblock main2 %}
HTML转义
举例:
return render(request,'users/index11.html',{'code':'<h1>suck is hao de </h1>'})
<h1>{{ code|safe }}</h1> #转义一个
#下面是同时转义多个
<h1>
{% autoescape off %}
{{ code }}
{% endautoescape %}
**过滤器**
语法:{{var(即变量)|过滤器}}
作用:再变量被显示前修改它
过滤器的种类:
一、lower 小写
二、upper 大写 例:<h1>{{ str|upper }}</h1>
三、过滤器可以传递参数,参数用引号引起来:
1.join 格式 列表|join:'#' 列表|join:'连接的东西'
例:<h1>{{ list|join:'#' }}</h1>
四、如果一个变量没有被提供,或者值为False,空,可以使用默认值
1.default
格式:{{var|default:'good'}}
例:<h1>{{ lis4t|default:'godd' }}</h1>
五、根据给定的格式转换日期为字符串
1.date
格式:{{ dateval|date:'y-m-d'}}
六、HTML转义
1.escage
七、加减乘除
<h1>{{ num|add:10 }}</h1>
<h1>{{ num|add:-5 }}</h1>
<!--num/1*5(num除以1乘5)后面必须带两个值,格式规定-->
<h1>{% widthratio num 1 5%}</h1>
<!--num/5*1(num除以5乘1)-->
<h1>{% widthratio num 5 1%}</h1>
标签:include
加载模板(带参数渲染)
格式:{% include '模板位置' with 参数1 参数2 参数3..... %}
举例:{% include 'index_context.html'%}
"""