首页 > 代码库 > 17.Django表单验证
17.Django表单验证
Django提供了3中方式来验证表单
官网文档:https://docs.djangoproject.com/en/1.9/ref/validators
1.表单字段验证器
a.引入:from django.core.exceptions import ValidationError
b.定义验证方法,验证不通过抛一个ValidationError异常
def validate_name(value):
验证不通过
raise ValidationError("%s的信息已经存在"%value)
验证通过
pass
c.在Form中定义字段时候,通过validators指定验证器
name = forms.CharField(label="名称", validators=[validate_name])
例子:
from django import forms
from hello.models import Publisher
from django.core.exceptions import ValidationError
def validate_name(value):
if value =http://www.mamicode.com/="xiaol":
raise ValidationError("%s的信息已经存在" % value)
else:
pass
class PublisherForm(forms.ModelForm):
name = forms.CharField(label="名称", validators=[validate_name])
class Meta:
model = Publisher
exclude = ("id",)
2.clean_filedName,针对某个字段进行验证
a.在ModelForm中定义clean_filedName实例方法
b.这里如果验证不通过抛异常
c.如果验证通过需要把值在return出去,否则表单就获取不到这个值了
def clean_name(self):
value = http://www.mamicode.com/self.cleaned_data.get(‘name‘)
验证不通过
raise ValidationError("%s的信息已经存在"%value)
验证通过
return value
例子:
from django import forms
from hello.models import Publisher
from django.core.exceptions import ValidationError
class PublisherForm(forms.ModelForm):
def clean_name(self):
value = http://www.mamicode.com/self.cleaned_data.get(‘name‘)
if value =http://www.mamicode.com/="xiaol":
raise ValidationError("%s的信息已经存在" % value)
else:
return value
class Meta:
model = Publisher
exclude = ("id",)
3.表单clean方法,针对整个表单验证(比如确认密码这样的需求)
a.在ModelForm中定义clean实例方法,
b.这里是对整个表单进行验证,所以取值的时候就不能像clean_filedName那样取
c.需要先调用父类的clean方法,把表单的值保存到本地变量中,在从本地变量中取想要的值
d.和clean_filedName一样,这里验证通过也需要返回,但是这里返回的不是一个值,而是通过父类方法获取到的那个本地变量
e.和clean_filedName不同,这里验证不通过不是抛异常,而是通过 self._errors[‘字段名‘]=self.error_class(["提示信息"])的方式返回
def clean(self):
cleaned_data = http://www.mamicode.com/super(XXXModelForm,self).clean()
value = http://www.mamicode.com/cleaned_data.get(‘name‘)
验证不通过
self._errors[‘name‘]=self.error_class(["%s的信息已经存在" % value])
验证通过
return cleaned_data
例子:
from django import forms
from hello.models import Publisher
class PublisherForm(forms.ModelForm):
def clean(self):
cleaned_data = http://www.mamicode.com/super(PublisherForm, self).clean()
value = http://www.mamicode.com/cleaned_data.get(‘name‘)
if value =http://www.mamicode.com/="xiaol":
self._errors[‘name‘] = self.error_class(["%s的信息已经存在" % value])
else:
return cleaned_data
class Meta:
model = Publisher
exclude = ("id",)
备注:如果clean_fieldName和clean都定义了,那么两个都会执行,顺序是:clean_fieldName->clean
17.Django表单验证