一.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})