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,如需转载请自行联系原作者

目录
相关文章
|
11月前
|
缓存 监控 中间件
Django中间件自定义开发指南:从原理到实战的深度解析
Django中间件是Web应用的“交通警察”,在请求与响应过程中进行全局处理,适用于身份验证、日志记录、性能监控等功能。本文详解中间件的工作原理、开发步骤及实战案例,帮助开发者掌握自定义中间件的构建方法,提升Django应用的可维护性与扩展性。
554 0
|
Shell 数据库 网络架构
Django+DRF 实战:从异常捕获到自定义错误信息(下)
本文详解了 Django REST Framework 中 ValidationError 的验证流程与优先级,涵盖字段内置验证、自定义验证方法、对象级验证及数据库约束,并通过实战演示如何自定义异常提示信息。
279 1
Django+DRF 实战:从异常捕获到自定义错误信息(下)
|
Python
Django+DRF 实战:自定义异常处理流程
本文详解DRF异常处理流程,包括默认处理机制与自定义异常处理器的实现方法。通过源码分析和实战示例,讲解如何全局捕获并统一返回错误信息,并结合日志记录与友好提示提升项目健壮性。适用于Django进阶开发。
382 4
|
中间件 数据库 Python
Django实战:自定义中间件实现全链路操作日志记录
Django中间件是一套轻量级插件系统,用于全局处理请求与响应。通过自定义中间件可实现如操作日志记录等功能,支持在请求、视图、响应及异常阶段插入逻辑。本文详解中间件生命周期、编写方式及实战案例。
297 1
|
数据安全/隐私保护 网络架构 UED
Django+DRF 实战:从异常捕获到自定义错误信息
本文介绍了DRF(Django REST framework)中的异常处理机制,重点讲解了内置异常类ValidationError的使用场景与示例。同时通过用户注册功能的实战演示,展示了如何在序列化器中自定义参数校验规则,并在视图中捕获并返回结构化的错误信息,提升接口的健壮性与用户体验。
257 0
|
数据采集 Python
Django 表单
【8月更文挑战第24天】
176 3
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
343 2
|
安全 数据库 数据安全/隐私保护
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API