Django实战搭建mock系统(四)_CBV,form.py对登录页面输入框校验

一.CBV,基于class来实现视图

之前所有的视图都是基于函数来实现的,也就是FBV,我们以前面的登录为例,实现CBV,也就是基于class来实现视图。
首先新建一个类,继承View
在这里插入图片描述
补全一下get方法,返回登录页面,继承的View方法里已经包含get方法了,我们要做的就是给这个get方法指定一个页面
在这里插入图片描述

然后到url里面更改一下跳转path,调用固定方法as_view,注意要加括号。测试一下,可以访问login页面
在这里插入图片描述
然后再来写一下这个CBV里面的post方法,定义一下post方法,然后里面的代码照搬,注意把之前用的login_test这个FBV注释掉
在这里插入图片描述
然后还是到url里面改写一下path。测试一下,可以登录成功。
如果这边登录的时候报csrf的错,还是像前面的文章,到login.html的form表单里把那两行代码删掉就行了。
在这里插入图片描述

贴一下view里的CBV代码

class Test_class_login(View):
    def get(self,request):
        return render(request,'login.html',{})
    def post(self,request):
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 如果判定成功,返回user对象,否则返回空
        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return HttpResponse('登录成功')
        else:
            return HttpResponse('登录失败')

url里的path

path('login/',Test_class_login.as_view(),name= 'login'),
path('login_post/',Test_class_login.as_view(),name='login_post'),

二.用form表单来对登录字段进行校验限制

在app下面创建一个form.p文件,在其中对username和password两个字段进行限制。
在这里插入图片描述

然后在POST请求里调用刚刚创建的这个类,成功应用了forms.py里的限制:用户名和密码都不能为空,如果为空,返回404页面
在这里插入图片描述

一个成熟的登录验证流程,在输入的字段不符合要求时,我们应该收集错误信息,然后把错误信息返回到登录页面,显示给用户看。
由于错误信息都是存放在定义的login_form里面,所以我们直接把login_form传给登录页面
在这里插入图片描述

然后在login.html里面做如下处理,在包含用户名输入框的div里做判断,加入代码{% if login_form.errors.username %} errorput {% endif %}。如果username为空,则login_form.errors.username是有值的,那么就在这个div里加上errorput这个样式,可以使得输入框的边框变红。
在这里插入图片描述
然后我们再专门划定一块div,报错信息全部写在里面。已知login_form.errors是个存放上述错误信息的字典。我们在后面加上items,将每组键值对组成一组元组,用于遍历访问。我们遍历这个字典里的每个value,然后统一展示在划定的div区域里面。{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}
在这里插入图片描述

看一下效果在这里插入图片描述

但上述的报出的提示只是表单验证不通过,也就是输入的用户名或者密码字段不符合要求所报出的错。
如果用户名和密码不匹配,报出的提示呢
还是在view里面,如果根据输入的用户名和密码无法在数据库里面找到匹配项,那么就返回一个提示给前端页面。
在这里插入图片描述

然后把msg放到前端页面去展示{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}
在这里插入图片描述

成功。
在这里插入图片描述

贴一下view里面的代码

class Test_class_login(View):
    def get(self,request):
        return render(request,'login.html',{})
    def post(self,request):
        login_form = LoginForm_Judge(request.POST)
        if login_form.is_valid():
            # username = request.POST.get('username')
            # password = request.POST.get('password')
            username = login_form.cleaned_data['username']
            password = login_form.cleaned_data['password']
            # 如果判定成功,返回user对象,否则返回空
            user = authenticate(username=username, password=password)
            if user:
                login(request, user)
                return HttpResponse('登录成功')
            else:
                return render(request,'login.html',{'msg':'用户名与密码不匹配'})
        else:
            return render(request,'login.html',{'login_form':login_form})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSQ的测试日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值