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 == "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 = 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 = self.cleaned_data.get('name')
if value == "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 = super(XXXModelForm,self).clean()
      value = 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 = super(PublisherForm, self).clean()
value = cleaned_data.get('name')
if value == "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

 

转载于:https://www.cnblogs.com/413xiaol/p/6512543.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值