Django视图学习——内置通用视图

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”,验证是否能正确显示验证码并完成验证

输入正确时:

单击验证码图片:

 

输入错误时:

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值