Django 表单(中下)- 自定义钩子进行数据验证

简介:

在前面的例子里面 http://beanxyz.blog.51cto.com/5570417/1963702,已经演示了form可以自动地对正则进行合法的判断,如果不合法,会直接显示错误信息。


但是这个功能并不完善,比如说一个数据可能正则判断合法了,但是不符合唯一性的判断,那么怎么处理?我们可以通过 form的 hook(钩子)进行自定义。


如果我们查看 Is_valid这个方法,我们可以看见

1
2
3
4
5
6
     def  is_valid( self ):
         """
         Returns True if the form has no errors. Otherwise, False. If errors are
         being ignored, returns False.
         """
         return  self .is_bound  and  not  self .errors


追踪self.errors

1
2
3
4
5
6
     @ property
     def  errors( self ):
         "Returns an ErrorDict for the data provided for the form"
         if  self ._errors  is  None :
             self .full_clean()
         return  self ._errors


追踪 full_clean(), 这里是系统给我们预留的3个hook,分别代表对字段的clean,对整个form的clean,和clean之后的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     def  full_clean( self ):
         """
         Cleans all of self.data and populates self._errors and
         self.cleaned_data.
         """
         self ._errors  =  ErrorDict()
         if  not  self .is_bound:   # Stop further processing.
             return
         self .cleaned_data  =  {}
         # If the form is permitted to be empty, and none of the form data has
         # changed from the initial data, short circuit any validation.
         if  self .empty_permitted  and  not  self .has_changed():
             return
         self ._clean_fields()
         self ._clean_form()
         self ._post_clean()


因此form验证的顺序是,默认的正则判断-》对应每一个字段单独的验证(clean)-》整个form的clean验证-》clean之后的操作


实例:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from  django.core.exceptions  import  ValidationError
from  django  import  forms
from  django.forms  import  widgets
from  django.forms  import  fields
from  app01  import  models
class  RegisterForm(forms.Form):
     user  =  fields.CharField
     email  =  fields.EmailField
     def  clean_user( self ):   # 对user做一个单独的验证
         =  models.UserType.objects. filter (name = self .cleaned_data[ 'user' ])
         if  c :   # 如果用户名已经存在,提示报错信息
             raise  ValidationError( '用户名已经存在' ,code = 'xxx' )
         else :   # 不存在,验证通过
             return  self .cleaned_data[ 'user' ]
     def  clean_email( self ):   # 对email做单独的验证
         # 验证必须要有返回值
         return  self .cleaned_data[ 'email' ]
# 验证顺序:
     # 先user字段,在clean_user方法
     # 再email字段,在clean_email方法
     
  def  register(request):
     from  cmdb.forms  import  RegisterForm     from  django.core.exceptions  import  NON_FIELD_ERRORS
     obj  =  RegisterForm(request.POST)     if  obj.is_valid():
         obj.cleand_data     else :
         obj.errors
         {            
             'user' :[{ 'code' : 'required' , 'message' : 'xxxx' }],            
             'pwd' :[{ 'code' : 'required' , 'message' : 'xxxx' }],            
             # 上面每个字段的错误信息放在里面,那clean总的错误信息放在哪里?
             '__all__' :[],   # 特殊的整体错误信息,放在这里
             # NON_FIELD_ERRORS:[], 和 __all__ 一个意思。
         }





本文转自 beanxyz 51CTO博客,原文链接:http://blog.51cto.com/beanxyz/1970277,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
3月前
|
安全 数据库 数据安全/隐私保护
|
3月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
63 2
|
3月前
|
数据采集 Python
Django 表单
【8月更文挑战第24天】
31 3
|
3月前
|
Python
Django表单组件
【8月更文挑战第20天】
33 1
|
3月前
|
前端开发 JavaScript 数据处理
Django的表单处理
【8月更文挑战第16天】
22 2
|
3月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
|
3月前
|
中间件 API 网络架构
Django后端架构开发:从匿名用户API节流到REST自定义认证
Django后端架构开发:从匿名用户API节流到REST自定义认证
39 0
|
5月前
|
Python
Django表单
【6月更文挑战第13天】Django表单。
29 5
|
5月前
|
测试技术 数据库 Python
使用django构建表单测试
【6月更文挑战第14天】该文档介绍了如何对本地库进行自动化测试,特别是关注于代码结构和模型测试。作者鼓励为其他模型和表单创建类似的测试,并提及测试应避免对底层框架的重复验证。
72 0
使用django构建表单测试