问题引入——当编写登录逻辑的时候,需要对form表单中用户提交过来的数据进行简单的校验。之前我对其进行校验都是直接在视图函数中使用if进行,确实可以,但是有B格吗?没有,所以咱不那样干了这次! 其实,不那样用的最主要的原因是:django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性还可以用来生成HTML代码!!!
注:虽然form可以生成前端页面,但这个功能实际用的少,主要是是用form表单的验证功能!
from django import forms
from django.core.validators import RegexValidator #导入校验器,供下面验证电话号码用
#校验登录
class LoginForm(forms.Form):
#长度校验/非空提醒
username = forms.CharField(max_length=16,min_length=6,error_messages=
{"max_length":"长度不能超过16位",
"min_length":"长度不能小于6位",
"required":"用户名不能为空"
})
password = forms.CharField(max_length=16,min_length=6,error_messages=
{"max_length":"长度不能超过16位",
"min_length":"长度不能小于6位",
"required": "密码不能为空"
})
""""
解释如下注释的原因:
下面这个函数clean()是用于进行数据验证的,本来我想也写在此form表单校验里,但是后面在视图函数里写业务逻辑时发现,
如果验证成功,用户需要登录->这就意味着需要设置session,而session是通过request对象来设置,在视图函数里直接有,可以直接使用;
而如果在此form表单校验里写的话还需要导入,是不是多此一举了,所以此处注释,本逻辑在视图函数里完成!
"""
# def clean(self): # 前端表单用户输入的数据经过上面过滤后再结合后台数据库所有数据进行分析
# # 校验数据库中是否有该用户
# # 1.拿取用户名和密码
# username = self.cleaned_data.get("username")
# password = self.cleaned_data.get("password")
# # 2.进行判断
# user = User.objects.filter(username=username, password=password)
# return user if user else None
#校验注册
class RegisterFrom(forms.Form):
# 长度校验/非空提醒
username = forms.CharField(max_length=16, min_length=6, error_messages=
{"max_length": "长度不能超过16位",
"min_length": "长度不能小于6位",
"required": "用户名不能为空"
})
password = forms.CharField(max_length=16, min_length=6, error_messages=
{"max_length": "长度不能超过16位",
"min_length": "长度不能小于6位",
"required": "密码不能为空"
})
phone = forms.CharField(max_length=11, min_length=1, validators=[RegexValidator(r"^1[3-9][0-9]{9}$","手机号格式有误!")],error_messages=
{"max_length": "手机号只能为11位",
"min_length": "手机号只能为11位",
"required": "手机号不能为空"
})
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View #使用类视图,要导入!
from .models import User
from .forms import LoginForm, RegisterFrom
class LoginResponse(View):
def get(self,request):
username = request.session.get("username")
return render(request, "mucis/login.html", context={"username":username})
def post(self, request):
"""
登录逻辑
:return:
"""
# 获取用户数据
data = request.POST
# 校验数据
# 校验数据是否存在,判断长度/格式
'''
打印观察request.POST,其数据格式:
<QueryDict: {'csrfmiddlewaretoken':['ILsinMw9...VBBR'], 'username':
['124134314'], 'password': ['3432423']}>
会发现它是一个字典类型,包含了用户输入的数据。而我们form表单检验需要在实例化传入的
值就是字典类型,所以直接传入request.POST即可!
'''
form = LoginForm(data) # 将获取到的参数传入RegisterForm类,
if form.is_valid(): # 用is_valid()方法验证提交数据的合法性,即是否通过form校验
# 获取数据
username = form.cleaned_data.get("username") # # 获取经过form组件清洗过后的信息 用cleaned_data获取单个数据对象值
password = form.cleaned_data.get("password")
# 判断数据库是否有该用户
user = User.objects.filter(username=username, password=password).first() # 获取用户实例
if user:
# 设置session信息
request.session["username"] = user.username
return redirect(reverse('login')) # 重定向到登录页面,重新请求一下登录页面
else: # 获取到form表单中的具体的错误格式的信息!【通过调试发现表单校验的错误信息都在form.errors里~】
error = form.errors
err_li = []
for e in error: # error为类似字典类型。for循环得到的是字典的键
err_li.append(error.get(e).data[0].message + ",")
return HttpResponse(err_li)
class RegisterResponse(View):
def get(self,request):
return render(request,"mucis/register.html")
def post(self,request):
"""
注册逻辑
:return:
"""
# 获取用户数据
data = request.POST
# 校验数据
form = RegisterFrom(data)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
# 入库
try:
User.objects.create(username=username,password=password)
return redirect(reverse("login"))
except Exception as e:
return redirect(reverse("register")) #如果出现异常,就返回注册页面!
else:
error = form.errors
err_li = []
for e in error: #error为类似字典类型。for循环得到的是字典的键
err_li.append(error.get(e).data[0].message+",")
return HttpResponse(err_li)
def logout(request):
"""
退出登录
:param request:
:return:
"""
request.session.flush()
return redirect(reverse("login"))
点击注册后,注册成功,跳转至登录页面:
观察数据库,也有了对应的用户数据:
点击登录之后,会发现登录成功哦!
点击退出登录之后,跳转登录界面,OK!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。