Django提供了一些内置的基本类的视图,这些视图结合模板可快速完成Web页面设计。本文介绍两个内置通用视图:DatailView、ListView
1、通用视图DatailView
2、通用视图ListView
3、实践:实现图形验证码
1、通用视图DatailView
DatailView用于显示单个模型对象的数据。通常情况下,在URL中向视图提交对象的id,视图使用id获得模型对象,并将模型对象传递给模板
例如,使用DatailView显示user表中特定用户的数据
(1)扩展DatailView类
chapter5/test1/views.py
from django.http import HttpResponse
from datetime import datetime
from django.views.generic.detail import DetailView
from . import models
class userDetailView(DetailView):
model = models.user # 指定模型
def get_context_data(self, **kwargs):
context=super().get_context_data(**kwargs)
context['now']=datetime.now() # 向上下文添加额外数据
return context
本例通过重载 get_context_data() 方法,在上下文中添加了当前日期,说明可通过上下文模型传递模型对象之外的数据。如果不需要向模板传递额外数据,则只需要指定模型。
(2)其次,定义模板。默认情况下,DatailView子类使用的模板文件名为“模型名称_detail.html”.本例中使用的模型名称为user,所以默认模板文件名为“user_detail.html”.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用内置Detail视图</title>
</head>
<body>{{now}}<br />
<b>id: </b>{{object.id}}<br />
<b>姓名: </b>{{object.name}}<br />
<b>年龄: </b>{{object.age}}
</body>
</html>
(3)最后,配置URL,访问userDetailView视图
#chapter5\chapter5\urls.py
from django.urls import path
from django.contrib import admin
from django.views.decorators.csrf import csrf_exempt
from chapter5 import views
urlpatterns = [
path('detail/<int:pk>', csrf_exempt(views.userDetailView.as_view())),
]
代码中的<int:pk>表示接受的参数为整数,且应该是模型的主键。
在浏览器中访问“http://127.0.0.1:8000/detail/1”,结果如图:
2、通用视图ListView
ListView用于显示多个模型对象的数据,数据显示格式有模板定义
本节在实例中使用ListView显示user表的全部数据。
(1)首先,扩展ListView类
chapter5/test1/views.py
from django.http import HttpResponse
from datetime import datetime
from django.views.generic import ListlView
from . import models
class userListView(ListView):
model=models.user #指定模型
(2)其次,定义模板。本例中使用的模型名称为user,所以默认模板文件名为“user_list.html”.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用内置List视图</title>
</head>
<body>
默认数据库user表数据
<table>
<tr><td>id</td><td>name</td><td>age</td></tr>
{% for user in object_list %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.age}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
(3)最后,配置URL,访问userListView视图
#chapter5\chapter5\urls.py
from django.urls import path
from django.contrib import admin
from django.views.decorators.csrf import csrf_exempt
from chapter5 import views
urlpatterns = [
path('list/', views.userListView.as_view()),
]
在浏览器中访问“http://127.0.0.1:8000/list”,结果如图:
3、实践:实现图形验证码
本节综合应用知识,实现图像验证码功能,如图所示,输入图片中显示的验证码后,单击“提交”按钮,验证结果如图:
基本思路:使用PIL库动态创建验证码图片,用FileResponse将验证码图片返回客户端,用session对象保存验证码,用于验证用户输入的验证码是否正确。
具体操作如下:
(1)在视图文件中导入需要的库:
from random import randint,choice
from PIL import Image,ImageDraw,ImageFont
from django.http import HttpResponse
(2)定义函数获取随机字符,字符在数字。小写字母和大写字母中随机选取。
def getRandomChar(): # 获取随机字符
num=str(randint(0,9)) #获取随机数字
lower=chr(randint(97,122)) #获取随机小写字母
upper=char(randint(65,90)) #获取随机大写字母
char=choice([num,lower,upper]) #选择要使用的随机字符
return char
(3)定义视图函数创建验证码图片
def creatImg(request): #创建验证码图片返回
img=Image.new(mode="RGB",size=(160,30),color=(100,100,100)) #创建图片
draw=ImageDraw.Draw(img) #获取图片画笔,用户描绘字
# 设置字体,字体文件和文件放在同一个文件中
font=ImageFont.truetype(font="arial.ttf",size=24)
code=''
for i in range(5):
c=getRandomChar() # 获取随机字符
draw.text((10+30*i,2),text=c,fill=(255,255,255),font=font) # 根据坐标填充汉字
code+=c # 记录验证码字符
request.session['randomcode']=code # 将验证码存入Session
f=open("test.png","wb")
img.save(f,format="png") # 将验证码图片存入文件
f.close()
return FileResponse(open("test.png",'rb')) # 将验证码图片文件返回客户端
(4)配置URL访问createlmg视图
urlpatterns = [
path('getpng',views.creatImg),
]
(5)在浏览器中访问“http://127.0.0.1:8000/getpng”,查看验证码图片,如图所示
刷新
(6)定义视图函数使用图片验证码
def imgCheckCode(request):
form = '<form name="input" action="/docheck" method="post">' \
+ '<a href="getcheck"><img src="/getpng"></a>单击图片刷新<br>'\
+'请输出:<i图片中的验证码:<input type="text" name="code" maxlength=5 size=8>' \
+ '<input type="submit", value="提交"></form>'
return HttpResponse(form)
代码中表单action的属性设置为"/docheck",该URL访问的试图验证用户提交的验证码是否正确。超链接的href属性设置为"getcheck",该URL访问验证码输入页面,用于执行页面刷新操作,以便显示新的验证码。图片的src属性设置为"getpng",该URL返回验证码图片、
(7)添加访问试图imgCheckCode的URL配置
urlpatterns = [
....
path('getcheck',views.imgCheckCode),
]
(8)定义视图函数,验证用户输入的验证码。
def verifyCode(request): # 验证用户提交的验证码是否正确
out="验证码不正确!"
if request.POST['code'].upper()==request.session['randomcode'].upper():
out="验证码正确!"
return HttpResponse(out)
(9)添加访问视图verifyCode的URL配置。
urlpatterns = [
....
path('docheck',csrf_exempt(views.verifyCode)),
]
因为视图verifyCode要接受表单数据,所以要使用csrf_exempt()设置例外,不执行CSRF安全验证。
(10)在浏览器中访问“http://127.0.0.1:8000/getcheck”,验证是否能正确显示验证码并完成验证
输入正确时:
单击验证码图片:
输入错误时: