django 模版-标签-视图-csrf-token-模版继承-HTML过滤器
""" ******模版****** --定义模版-- **变量** 视图传递给模版的数据 注意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'%} """