Django-Form表单验证
urls.py文件内容
fromapp01importviewsurlpatterns=[path('fm/',views.fm),]
views.py文件内容
#表单验证#引入forms模块fromdjangoimportforms#创建classFM(forms.Form):#变量名字必须要跟form表单里的名字一一对应user=forms.CharField(error_messages={'required':'用户不能为空'})#ChharField表示传入的得是字符串pwd=forms.CharField(max_length=12,#最大字符串为12个min_length=6,#最小字符串为6个error_messages={'required':'密码不能为空','min_length':'最小字符为6个','max_length':'最大字符为12个'})#ChharField表示传入的得是字符串email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱地址不正确'})#EmailField表示传入的得是邮箱格式deffm(request):ifrequest.method=="GET":#不用传入参数创建FM对象,对象名字obj必须跟下面的对象名字obj一样,obj=FM()#如果把obj这样传入fm.html里之后,那么fm.html里的内容就可以用以下方式写:直接用{{obj.user}}、{{obj.pwd}}、{{obj.email}}生成html元素#并且保留上一次提交的数据"""<formaction="/app01/fm/"method="post">{%csrf_token%}<p>{{obj.user}}{{obj.errors.user.0}}</p><p>{{obj.pwd}}{{obj.errors.pwd.0}}</p><p>{{obj.email}}{{obj.errors.pwd.0}}</p><inputtype="submit"value="提交"></form>"""returnrender(request,'fm.html',{'obj':obj})elifrequest.method=='POST':#创建验证对象,并且把request.POST(提交的POST里面所有的数据)传进去obj=FM(request.POST)#obj.is_valid()会产出一个返回值:是否成功布尔类型r1=obj.is_valid()print(r1)ifr1:#验证通过之后返回正确信息的一个字典obj.cleaned_data,这是个字典#此处如果是注册功能的话,就可以把注册信息的字典写入数据库print(obj.cleaned_data)else:#验证不通过之后返回一个所有的错误信息:obj.errors,是一大串字符串一个包含user、pwd、email错误信息的html格式的ul标签print(obj.errors)#获取user的第一个错误信息#print(obj.errors['user'][0])#会把字符串转换成字典形式print(obj.errors.as_json())"""错误信息里的错误提示信息可以改成自定义中文的,后面加参数classFM(forms.Form):#变量名字必须要跟form表单里的名字一一对应user=forms.CharField(error_messages={'required':'用户不能为空'})#ChharField表示传入的得是字符串pwd=forms.CharField(error_messages={'required':'密码不能为空'})#ChharField表示传入的得是字符串email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱地址不正确'})#EmailField表示传入的得是邮箱格式"""#把obj对象以参数形式传入到fm.html里进行渲染returnrender(request,'fm.html',{'obj':obj})returnrender(request,'fm.html')
fm.html文件内容
<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><formaction="/app01/fm/"method="post">{%csrf_token%}<p><inputtype="text"name="user">{{obj.errors.user.0}}</p><p><inputtype="password"name="pwd">{{obj.errors.pwd.0}}</p><p><inputtype="text"name="email">{{obj.errors.pwd.0}}</p><inputtype="submit"value="提交"></form></body></html>
Form类创建Form类时,主要涉及到 【字段】 和 【插件】,字段用于对用户请求数据的验证,插件用于自动生成HTML;
Fieldrequired=True,是否允许为空widget=None,HTML插件label=None,用于生成Label标签或显示内容initial=None,初始值help_text='',帮助信息(在标签旁边显示)error_messages=None,错误信息{'required':'不能为空','invalid':'格式错误'}show_hidden_initial=False,是否在当前插件后面再加一个隐藏的且具有默认值的插件(可用于检验两次输入是否一直)validators=[],自定义验证规则localize=False,是否支持本地化disabled=False,是否可以编辑label_suffix=NoneLabel内容后缀CharField(Field)max_length=None,最大长度min_length=None,最小长度strip=True是否移除用户输入空白IntegerField(Field)max_value=None,最大值min_value=None,最小值FloatField(IntegerField)...DecimalField(IntegerField)max_value=None,最大值min_value=None,最小值max_digits=None,总长度decimal_places=None,小数位长度BaseTemporalField(Field)input_formats=None时间格式化DateField(BaseTemporalField)格式:2015-09-01TimeField(BaseTemporalField)格式:11:12DateTimeField(BaseTemporalField)格式:2015-09-0111:12DurationField(Field)时间间隔:%d%H:%M:%S.%f...RegexField(CharField)regex,自定制正则表达式max_length=None,最大长度min_length=None,最小长度error_message=None,忽略,错误信息使用error_messages={'invalid':'...'}EmailField(CharField)...FileField(Field)allow_empty_file=False是否允许空文件ImageField(FileField)...注:需要PIL模块,pip3installPillow以上两个字典使用时,需要注意两点:-form表单中enctype="multipart/form-data"-view函数中obj=MyForm(request.POST,request.FILES)URLField(Field)...BooleanField(Field)...NullBooleanField(BooleanField)...ChoiceField(Field)...choices=(),选项,如:choices=((0,'上海'),(1,'北京'),)required=True,是否必填widget=None,插件,默认select插件label=None,Label内容initial=None,初始值help_text='',帮助提示ModelChoiceField(ChoiceField)...django.forms.models.ModelChoiceFieldqueryset,#查询数据库中的数据empty_label="---------",#默认空显示内容to_field_name=None,#HTML中value的值对应的字段limit_choices_to=None#ModelForm中对queryset二次筛选ModelMultipleChoiceField(ModelChoiceField)...django.forms.models.ModelMultipleChoiceFieldTypedChoiceField(ChoiceField)coerce=lambdaval:val对选中的值进行一次转换empty_value=''空值的默认值MultipleChoiceField(ChoiceField)...TypedMultipleChoiceField(MultipleChoiceField)coerce=lambdaval:val对选中的每一个值进行一次转换empty_value=''空值的默认值ComboField(Field)fields=()使用多个验证,如下:即验证最大长度20,又验证邮箱格式fields.ComboField(fields=[fields.CharField(max_length=20),fields.EmailField(),])MultiValueField(Field)PS:抽象类,子类中可以实现聚合多个字典去匹配一个值,要配合MultiWidget使用SplitDateTimeField(MultiValueField)input_date_formats=None,格式列表:['%Y--%m--%d','%m%d/%Y','%m/%d/%y']input_time_formats=None格式列表:['%H:%M:%S','%H:%M:%S.%f','%H:%M']FilePathField(ChoiceField)文件选项,目录下文件显示在页面中path,文件夹路径match=None,正则匹配recursive=False,递归下面的文件夹allow_files=True,允许文件allow_folders=False,允许文件夹required=True,widget=None,label=None,initial=None,help_text=''GenericIPAddressFieldprotocol='both',both,ipv4,ipv6支持的IP格式unpack_ipv4=False解析ipv4地址,如果是::ffff:192.0.2.1时候,可解析为192.0.2.1,PS:protocol必须为both才能启用SlugField(CharField)数字,字母,下划线,减号(连字符)...UUIDField(CharField)uuid类型...
2、Django内置插件:
TextInput(Input)NumberInput(TextInput)EmailInput(TextInput)URLInput(TextInput)PasswordInput(TextInput)HiddenInput(TextInput)Textarea(Widget)DateInput(DateTimeBaseInput)DateTimeInput(DateTimeBaseInput)TimeInput(DateTimeBaseInput)CheckboxInputSelectNullBooleanSelectSelectMultipleRadioSelectCheckboxSelectMultipleFileInputClearableFileInputMultipleHiddenInputSplitDateTimeWidgetSplitHiddenDateTimeWidgetSelectDateWidget常用选择插件
#单radio,值为字符串#user=fields.CharField(#initial=2,#widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))#)#单radio,值为字符串#user=fields.ChoiceField(#choices=((1,'上海'),(2,'北京'),),#initial=2,#widget=widgets.RadioSelect#)#单select,值为字符串#user=fields.CharField(#initial=2,#widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))#)#单select,值为字符串#user=fields.ChoiceField(#choices=((1,'上海'),(2,'北京'),),#initial=2,#widget=widgets.Select#)#多选select,值为列表#user=fields.MultipleChoiceField(#choices=((1,'上海'),(2,'北京'),),#initial=[1,],#widget=widgets.SelectMultiple#)#单checkbox#user=fields.CharField(#widget=widgets.CheckboxInput()#)#多选checkbox,值为列表#user=fields.MultipleChoiceField(#initial=[2,],#choices=((1,'上海'),(2,'北京'),),#widget=widgets.CheckboxSelectMultiple#)
在使用选择标签时,需要注意choices的选项可以从数据库中获取,但是由于是静态字段 ***获取的值无法实时更新***,那么需要自定义构造方法从而达到此目的。
方式一:
fromdjango.formsimportFormfromdjango.formsimportwidgetsfromdjango.formsimportfieldsfromdjango.core.validatorsimportRegexValidatorclassMyForm(Form):user=fields.ChoiceField(#choices=((1,'上海'),(2,'北京'),),initial=2,widget=widgets.Select)def__init__(self,*args,**kwargs):super(MyForm,self).__init__(*args,**kwargs)#self.fields['user'].widget.choices=((1,'上海'),(2,'北京'),)#或self.fields['user'].widget.choices=models.Classes.objects.all().value_list('id','caption')
方式二:
使用django提供的ModelChoiceField和ModelMultipleChoiceField字段来实现
fromdjangoimportformsfromdjango.formsimportfieldsfromdjango.formsimportwidgetsfromdjango.formsimportmodelsasform_modelfromdjango.core.exceptionsimportValidationErrorfromdjango.core.validatorsimportRegexValidatorclassFInfo(forms.Form):authors=form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())#authors=form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。