Django的Form验证
Form验证:Form提交Form表单数据验证
针对Form提交的数据进行验证
- 创建模板 class loginForm()
- 请求提交给模板,创建对象 obj=loginForm(request.POST)
- 进行验证 obj.is_valid
- 获取正确信息 obj.clean()
- 获取错误信息 obj.errors
后端返回给前端错误信息
刷新页面,模板对象内容值丰富(参数),(点击提交)刷新页面后值和报错信息都有
后端自动在前端生成html,保留前端信息
- 自动生成html标签
- 保留上一次提交的数据
注:测试时,要打开控制台修改自动生成的邮箱input的type="text"(修改掉高级浏览器的cream)
Title Django的Form表单验证
from django.shortcuts import render,redirect from django import forms from django.forms.utils import ErrorList # Create your views here. class loginForm(forms.Form): userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空", "min_length":"用户名长度不能小于6"}) userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"}) def login(request): if request.method == "GET": obj = loginForm() #默认GET,就不需要添加request.Post参数 #obj = loginForm({"userID":456,"userEmail":789}) #记录的上一次输入的值 return render(request,"login.html",{'oo':obj}) elif request.method == "POST": obj = loginForm(request.POST) status = obj.is_valid() print(status) if status: pad = obj.clean() print(pad) else: #error_obj = obj.errors.as_json() #字典形式输出(默认是ul li形式输出) #error_obj = obj.errors #ul li形式输出 # print(error_obj) # print(error_obj['userID'],type(error_obj['userID'])) # print(error_obj['userID'][0],type(error_obj['userID'][0])) # print(error_obj['userEmail'],type(error_obj['userEmail'])) # print(error_obj['userEmail'][0],type(error_obj['userEmail'][0])) print(obj.errors['userID'][0], type(obj.errors['userID'][0])) print(obj.errors['userEmail'][0], type(obj.errors['userEmail'][0])) return render(request,"login.html",{'oo':obj})
Form验证:Ajax提交Form表单数据验证
- 针对提交数据进行验证
- 错误信息处理
- 两次反序列化:obj.errors.as_json() 默认数据类型str(字符串)
- 一次反序列化:obj.errors.as_data() 默认数据类型dict(字典)
注:isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
1.isinstance()与type()区别:
type()不会认为子类是一种父类类型不考虑继承关系。
isinstance()会认为子类是一种父类类型,考虑继承关系。
判段两个类型是否相同时要清楚是否需要考虑继承关系,不考虑继承就用type()判断,需要考虑就用isinstance()判断。
2.ValidationError类型的数据在python中不支持json.dumps()序列化,所以需要自定义序列化类型创建cls=...
Title
Django的Form表单验证
import json
class loginForm(forms.Form):
userID = forms.CharField(min_length=6,error_messages={"required":"用户ID不能为空",
"min_length":"用户名长度不能小于6"})
userEmail = forms.EmailField(error_messages={"required":"邮箱不能为空","invalid":"邮箱格式错误"})
def logins(request):
if request.method == "GET":
return render(request,"logins.html")
elif request.method == "POST":
ret = {"status":True,"error":None,"data":None}
obj = loginForm(request.POST)
if obj.is_valid():
print(obj.clean())
else:
#两次反序列化
# ret_str = obj.errors.as_json() #ret_str是一个字符串
# ret["status"] = False
# ret["error"] = ret_str
#一次反序列化
ret["status"] = False
ret["error"] = obj.errors.as_data() #字典类型
#print(type(obj.errors.as_data()))
print(ret["error"])
#{'userID': [ValidationError(['用户名长度不能小于6'])], 'userEmail': [ValidationError(['邮箱格式错误'])]}
print(ret["error"]['userID'])
#[ValidationError(['用户名长度不能小于6'])]
return HttpResponse(json.dumps(ret,cls=JsonCustomEncoder))
from django.core.validators import ValidationError
class JsonCustomEncoder(json.JSONEncoder):
def default(self,field):
if isinstance(field,ValidationError): #判断是否为相同类型
return {'code':field.code,'message':field.message}
else:
return json.JSONEncoder.default(self,field)