我们可以直接改写 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个字符。']}