17.Django表单验证
Posted 413Xiaol
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于17.Django表单验证的主要内容,如果未能解决你的问题,请参考以下文章
原生JavaScript判断是否为邮箱危险字符验证长度验证网址验证小数整数浮点数等常用的验证