Form组件中关于对字段认证[clean,clean_字段]的补充(关于错误信息)

class RegesterForm(Form):
    username = fields.CharField(
        widget=widgets.TextInput(
            attrs={"class": "form-control",
                   "placeholder": "用户名",
                   }),
        error_messages={
            "required": "内容不能为空",
            "invalid": "格式错误,请重新输入!", })

    nickname = fields.CharField(
        widget=widgets.TextInput(
            attrs={"class": "form-control",
                   "placeholder": "即昵称",
                   }),
        error_messages={
            "required": "内容不能为空",
            "invalid": "格式错误,请重新输入!", })

    email = fields.EmailField(
        widget=widgets.TextInput(
          attrs={
              "class": "form-control",
              "placeholder": "请输入您查用邮箱",
          }),
        error_messages = {
            "required": "内容不能为空",
            "invalid": "格式错误,请重新输入!",}
    )

    password = fields.CharField(
        widget=widgets.PasswordInput(
            attrs={"class": "form-control",
                   "placeholder": "密码,必须包含数字,字母!",
                   }),
        error_messages={
            "required": "内容不能为空",
            "invalid": "格式错误,请重新输入!", })

    passwords = fields.CharField(
        widget=widgets.PasswordInput(
            attrs={"class": "form-control",
                   "placeholder": "请输入确认密码",
                   }),
        error_messages={
            "required": "内容不能为空",
            "invalid": "格式错误,请重新输入!", })

    avatar = fields.FileField(
        widget=widgets.FileInput(
            attrs={'id':"imgSelect",}),
    )
    code = fields.CharField(
        widget=widgets.TextInput(
            attrs={
                "class": "form-control",
                "placeholder": "验证码",
            },)
    )
    def __init__(self,request,*args,**kwargs):
        super(RegesterForm,self).__init__(*args,**kwargs)
        self.request = request

    def clean_code(self):
        input_code = self.cleaned_data["code"]
        session_code = self.request.session.get("code")
        if input_code.upper() == session_code.upper():
            return input_code
        raise ValidationError("验证码错误,请重新输入!")
    #自定义字段验证方法,获取错误信息的方式不变,还是   对象.errors.字段名.0

    def clean(self):
        p1 = self.cleaned_data.get("password")
        p2 = self.cleaned_data.get("passwords")
        if p1 == p2:
            return self.cleaned_data
        else:
            self.add_error("passwords",ValidationError("输入的密码不一致!"))  
对于Form组件的错误信息:
    注意再注意:
    默认错误信息方式: raise ValidationError("输入的密码不一致!")
    自定义对已拿到所有字段数据进行验证的时候,这种方式在获取错误信息时就发生改变,查看源码发现如果有错误的话,他会执行self.add_error(None, e)
    通过方法给字段None添加错误信息,查看add_error的源码以及执行过程,发现None = NON_FIELD_ERRORS。也就是说会默认给__all__字段或
    NON_FIELD_ERRORS写上错误信息。原因:内部定义的NON_FIELD_ERRORS="__all__",
    获取方式:
        前端获取 是通过obj.non_field_errors
        后台获取是通过 obj.errors["__all__"]  or   obj.errors[NON_FIELD_ERRORS]

    我们知道,当报错的时候,内部会自动去添加错误信息,若是我们能否手动指定某个字段呢?答案是肯定的。
    这样我们自己添加异常的错误信息,就能直接通过{{obj.errors.passwords.0}}获取到与其他的无疑。
    语法:
        self.add_error('字段名称', 错误异常对象)

  以上代码是我写用户注册时的form组件,由于牵扯到对输入字段的认证问题!如果选择在视图函数中,那代码的重复率可就老了去了!!!所以就使用了Form组件中的字段认证的方法!!!

  前面已经介绍过Form组件中两种验证方式的函数,一个对字段的 clean_字段;另一个是等所有字段验证之后,对所有验证过的clean_data进行更高的验证:clean;今天我要说的是关于验证过程中,产生和收集错误信息的问题。详见上面代码!!!

 

posted @ 2017-08-13 22:33  细雨蓝枫  阅读(196)  评论(0编辑  收藏  举报