首页 > 代码库 > 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表单验证