表单验证

发布于 2019-11-23 18:46:42   阅读量 137  点赞 0  

  Django中的表单验证都是针对格式以及数据类型的。

  1. 自定义的表单模型的属性都为forms类的一种Field子类的实例(类似于模型与models的关系)。定义表单类中的Field为表单验证的第一步,你期望提交上来的数据是什么类型,就使用什么类型的Field

  2. 由于通过前端表单提交上的数据都为字符串类型,对于某种类型的Field,在数据通过验证后,会自动将该数据转化为对应类型

  3. 对于验证错误的信息,可以在实例化相应的Field时传入名为eorr_messages的字典,其中的键为各Field预考虑好的对应验证失败的情况,值为该情况下对应输出的信息。如:

     email = forms.EmailField(error_messages={"invaild":"请输入正确的邮箱格式",
     "required":"请输入邮箱地址"})
    

     会在传入无效的邮箱地址的时候,设置错误信息messages为“请输入正确的邮箱格式”;  在传入空数据时,设置错误信息为“请输入邮箱地址”。

    1. 在验证错误的时候,调用表单对象的.errors.get_json_data()可以获得json格式的错误信息,对于将错误信息显示到前台很有用。

一、常用的Field

CharField

 用于接收字符型数据。

*参数:*

  • max_length:该字段值的最大长度;
  • min-length:该字段值的最小长度;
  • required:这个字段是否为必须的,默认为必须的;
  • error_messages:某个条件验证失败时,给出的错误信息   ##### EmailField   用来接收邮件地址,自动校验邮箱格式。

错误信息:

  • error_messages的键:requiredinvaild   ##### FloatField   用来接收浮点类型,若验证通过,会自动将这个字段的值转换为浮点类型。

*参数:*

  • max_value:指定最大值
  • min_value:指定最小值   ##### IntegerField   用来接收整型,并且验证通过后,会将该数据转换为整型。

*参数:*

  • max_value:指定最大值
  • min_value:指定最小值

*错误信息:*

  • error_messages的键:requiredinvalidmax_valuemin_value.   ##### DateField  用来接收一个日期字符串year-month-day。   ##### URLField   用来接收url格式的字符串。

*错误信息:*

  • error_messages的键:requiredinvalid.

二、常用验证器

  虽然forms类的不同Field已经内置了验证器实现了验证功能,但也可以在实例化字段的时候传递一个validators参数来指定验证器。validators参数的值为一个验证器实例。常用验证器有:

  1. MaxValueValidator:验证最大值
  2. MinValueValidator:验证最小值
  3. MinLengthValidator:验证最小长度
  4. MaxLengthValidator:验证最大长度
  5. EmailValidator:验证是否为邮箱格式
  6. URLValidator:验证是否为URL格式
  7. RegexValidator:验证是否匹配所指定的正则表达式,用来实现更复杂的验证

示例:

    email = forms.CharFiedld(validators=[validators.EmailValidator(message="请输入格式正确的邮箱")]

三、自定义验证

  若需要实现功能复杂的过滤,则可以自定义验证器,对前端表单提交上来的数据进行验证。数据的验证应通过表单完成,而不应该通过视图函数来完成,视图函数应只负责处理逻辑。 自定义验证器实际上就是一个定义在表单类里面的方法,该方法命名为clean_对应字段名,若验证错误,则抛出一个fomrs类的ValidationError异常,每当过表单对象调用is_valid方法时,都会自动调用该过滤器对相应字段进行验证。示例:

class MyForm(forms.Form):
    telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])

    def clean_telephone(self):
        telephone = self.cleaned_data.get('telephone')
        exists = User.objects.filter(telephone=telephone).exists()
        if exists:
            raise forms.ValidationError("手机号码已经存在!")
        return telephone

  该代码用以检测该手机号码是否已经注册过     以上时单独对某个字段进行验证,如果验证数据的时候,需针对多个字段进行验证,则可以重写clean方法,在该clean方法中使用super().clean()调用父类的clean函数进行其他字段过滤,再来实现自己所需的过滤功能。如要验证提交的两个密码是否相等,则:

class MyForm(forms.Form):
    telephone = forms.CharField(validators=[validators.RegexValidator("1[345678]\d{9}",message='请输入正确格式的手机号码!')])
    pwd1 = forms.CharField(max_length=12)
    pwd2 = forms.CharField(max_length=12)

    def clean(self):
        cleaned_data = super().clean()
        pwd1 = cleaned_data.get('pwd1')
        pwd2 = cleaned_data.get('pwd2')
        if pwd1 != pwd2:
            raise forms.ValidationError('两个密码不一致!')

四、提取错误信息

  若验证失败了,则我们需要将错误信息传递给前端:

  1. form.errors:获取包含了html标签的错误信息。
  2. form.errors.get_json_data():获取一个字典类型的错误信息,该字典以出错的字段名作为key,错误信息作为value。
  3. form.as_json():将form.get_json_data()返回的字典使用dump方法转换成json格式的字符串,方便传输。

*json格式的错误信息:*

{'username': [{'message': 'Enter a valid URL.', 'code': 'invalid'}, {'message': 'Ensure this value has at most 4 characters (it has 22).', 'code': 'max_length'}]}

 该信息显示了username字段验证失败的错误信息。


Last Modified : 2020-03-09 18:46:42