Django之Form组件验证
今天来谈谈Django的Form组件操作
Django中的Form一般有两种功能:
·输入html
·验证用户输入
Form验证流程
·定义规则(是一个类)
·前端把数据提交过来
·匹配规则
·判断提交过来的数据是否符合定义的规则
·如果匹配返回True,否则返回errors,可以把这个errors返回给前端,让前端显示到指定位置(比如用户名没填写,验证码没填写)
匹配规则
views.py
from django import forms from django.forms import widgets #Forms里的插件 里面有css插件和其他的插件 from django.forms import fields #CharField、EmailField等都在field里,而field在fdjango.forms里,所以以后使用fields.CharField()替代forms.CharField class FM(forms.Form): user=fields.CharField(error_messages={'required':"用户名不能为空"}, widget=widgets.Textarea(attrs={"class":"c1"})) #为User添加个“class='c1'”样式 pwd=fields.CharField( max_length=12, min_length=6, error_messages={'required':"密码不能为空", 'min_length':'密码长度不能小于6位', 'max_length':'密码长度不能大于12位'}, widget=widgets.PasswordInput(attrs={'class':'c2'})) email=fields.EmailField(error_messages={'required':"邮箱不能为空",'invalid':'邮箱格式错误'})
注意:规则中的字段名必须得等于html中name的值
Form表单方法
views.py
from app_01 import models def fm(request): if request.method=="GET": obj=FM() return render(request,'fm.html',{'obj':obj}) elif request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有的正确信息 #失败:显示错误信息 obj=FM(request.POST) r1=obj.is_valid() if r1: # models.UserInfo.object.create(obj.cleaned_data) 对其进行注册 print(obj.cleaned_data) else: return render(request,'fm.html',{'obj':obj}) return render(request,'fm.html')
方法:
obj.is_valid():验证表单数据是否合法
obj.errors:表单的错误以字典形式返回(如果有多个错误,可以循环这个字典,然后传给前端)
obj.cleaned_data:获取表单数据
obj.as_p:将表单渲染成P标签
示例:实现Form组件验证
前端html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/fm/" method="post"> <p><input type="text" name="user" />{{ obj.errors.user.0 }}</p> <p><input type="text" name="pwd" />{{ obj.errors.pwd.0 }}</p> <p><input type="email" name="email" />{{ obj.errors.email.0 }}</p> <input type="submit" value="提交" /> </form> </body> </html>
views.py
from django import forms class FM(forms.Form): user=forms.CharField(error_messages={'required':"用户名不能为空"}) pwd=forms.CharField( max_length=12, min_length=6, error_messages={'required':"密码不能为空", 'min_length':'密码长度不能小于6位', 'max_length':'密码长度不能大于12位'}) email=forms.EmailField(error_messages={'required':"邮箱不能为空",'invalid':'邮箱格式错误'}) from app_01 import models def fm(request): if request.method=="GET": obj=FM() return render(request,'fm.html',{'obj':obj}) elif request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有的正确信息 #失败:显示错误信息 obj=FM(request.POST) #request.POST是获取用户前端输入内容,例如:<QueryDict: {'pwd': ['1111'], 'user': ['11111'], 'undefined': ['提交']}> r1=obj.is_valid() #判断用户输入是否符合上面LoginForm定义的规则,如果符合返回True,否则范围False(符合规则就是 比如:不能为空,最大输入字符为10个等等) if r1: # models.UserInfo.object.create(obj.cleaned_data) 对其进行注册 print(obj.cleaned_data) #obj.clean()方法是获取用户输入内容(例如:{'pwd': '1111', 'user': '11111'}) else: print(obj.errors) #obj.errors是获取用户输入的错误信息,比如说规则里定义了不能为空,但是用户输入为空了,就会报错(例如:<li>pwd<ul class="errorlist"><li>This field is required.</li></ul>) return render(request,'fm.html',{'obj':obj}) return render(request,'fm.html')
在高级点,修改下前端的html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/fm/" method="post"> <p>{{ obj.user }} {{ obj.errors.user.0 }}</p> <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p> <p>{{ obj.email }} {{ obj.errors.email.0 }}</p> <input type="submit" value="提交" /> </form> </body> </html>
因为Django里没有手机验证,所以基于正则表达式的手机验证如下
import re from django import forms from django.core.exceptions import ValidationError def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') if not mobile_re.match(value): raise ValidationError('手机号码格式错误') class PublishForm(forms.Form): user_type_choice = ( (0, u'普通用户'), (1, u'高级用户'), ) user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice, attrs={'class': "form-control"})) title = forms.CharField(max_length=20, min_length=5, error_messages={'required': u'标题不能为空', 'min_length': u'标题最少为5个字符', 'max_length': u'标题最多为20个字符'}, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'标题5-20个字符'})) memo = forms.CharField(required=False, max_length=256, widget=forms.widgets.Textarea(attrs={'class': "form-control no-radius", 'placeholder': u'详细描述', 'rows': 3})) phone = forms.CharField(validators=[mobile_validate, ], error_messages={'required': u'手机不能为空'}, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'手机号码'})) email = forms.EmailField(required=False, error_messages={'required': u'邮箱不能为空','invalid': u'邮箱格式错误'}, widget=forms.TextInput(attrs={'class': "form-control", 'placeholder': u'邮箱'}))