自定义验证(二)

我们可以直接改写 Form 类的 clean() 方法来自定义表单的验证和错误信息。

现在我们定义一个用户注册表单,要求用户名不能出现脏话,两次密码输入必须一致。例子如下:

from django import forms

class UserRegisterForm(forms.Form):
    user_name = forms.CharField()
    password1 = forms.CharField()
    password2 = forms.CharField()

    def clean(self):
        cleaned_data = self.cleaned_data

        user_name = cleaned_data.get("user_name")
        password1 = cleaned_data.get("password1")
        password2 = cleaned_data.get("password2")

        if 'fuck' in user_name:
            msg = u"用户名不能使用脏话。"
            self._errors["dirty_word"] = self.error_class([msg])

            # 没通过验证的数据我们要删掉它
            del cleaned_data["user_name"]

        # 自定义验证条件
        if password1 != password2:

            # 自定义错误信息和错误类型
            msg = u"两次密码输入不同,请重新输入。"
            self._errors["diff_password"] = self.error_class([msg])

            # 没通过验证的数据我们要删掉它
            del cleaned_data["password1"]
            del cleaned_data["password2"]

        return cleaned_data

在 shell 中检查下:

# 检查用户名的验证
f = UserRegisterForm({'user_name':'fuck', 'password1':'123456', 'password2':'123456'})

# 注意,错误类型变成了我们自定义的:"dirty_word"
f.errors
>>> {'dirty_word': ['用户名不能使用脏话。']}

# 检查密码的验证
f = UserRegisterForm({'user_name':'diego', 'password1':'123456', 'password2':'12345'})

f.errors
>>>  {'diff_password': ['两次密码输入不同,请重新输入。']}




另一种自定义验证的方法是用超类的方法 super() 来改写原来的 clean() 方法。

另外,自定义错误类型和错误信息还能用 add_error() 方法(官方文档例子是这样用的)。

例子如下:

from django import forms

class UserRegisterForm(forms.Form):
    user_name = forms.CharField()
    password1 = forms.CharField()
    password2 = forms.CharField()

    def clean(self):
        cleaned_data = super(UserRegisterForm, self).clean()
        password1 = cleaned_data.get("password1")
        password2 = cleaned_data.get("password2")

        if password1 != password2:
            msg = "两次密码不一致。"
            self.add_error('password1', msg)

在 shell 中检查下:

f = UserRegisterForm({'name':'abc', 'password1': '12345', 'password2': '1234'})

f.errors
>>> {'password1': ['两次密码不一致。']}




我们也能定义 clean + 下划线 + 字段名 的函数,来对某个字段进行验证:

from django import forms

class UserRegisterForm(forms.Form):
    user_name = forms.CharField()
    
    def clean_user_name(self):
        cleaned_data = self.cleaned_data
        user_name = cleaned_data.get("user_name")

        if len(user_name) < 4:
            raise forms.ValidationError('用户名不能少于4个字符。')
        return user_name

在 shell 中检查下:

f = UserRegisterForm({'user_name':'11', })
f.errors

>>> {'user_name': ['用户名不能少于4个字符。']}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 3,443评论 2 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,663评论 25 708
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,974评论 6 342
  • 对菲作战征兵现场 征兵处 a、我是海军退役士兵,应祖国号召,请求参战! 征兵人员:好样的,是爷们!若有战,召必回!...
    文大科阅读 177评论 0 0