Form 源码
1. is_valid如果返回值如果为真 证明验证成功 意味着self.is_bound为True 和 self.errors为False def is_valid(self):
return self.is_bound and not self.errors 1).那么self.is_bound什么时候为真呢? 通过源码发现只有当实例化带参数的值时 self.is_bound 才为真 默认会把传入的值赋值给data data有值时 self.is_bound为真
2).那么self.errors什么时候为假呢? 请看下面 2. 类初始化时候self._errors为None 所以此时会执行 self.full_clean() @property
def errors(self): if self._errors is None:
self.full_clean()
return self._errors 3. 这部分代码的 最后生成 self.cleaned_data = {} 然后分别执行底下三个方法 def full_clean(self): self._errors = ErrorDict() # 当用户提交数据时self.is_bound为真 not Ture代为为假 所以这部分不执行
if not self.is_bound:
return # 创建一个 {}
self.cleaned_data = {} if self.empty_permitted and not self.has_changed():
return # 循环验证字段和字段对应的值 和钩子函数 如果验证成功 把字段和字段对应的值加入到self.cleand_data里面 错误会加入到self.errors里面
self._clean_fields() # 执行self.clean()函数 默认返回self.cleaned_data 可以在子类中子定义self.clean() 方法
self._clean_form() self._post_clean() 4. 循环类里面的字段 如果验证成功 将字段名和值 加入self.cleaned_data 例如: self.cleaned_data = {'username': 'alex'}
接着会找clean_字段名 的钩子函数,如果有此函数例如clean_username(),会执行此函数,并把结果覆盖 self.cleaned_data = {'username': 结果}
当循环完 username 会循环 password def _clean_fields(self):
for name, field in self.fields.items():
if field.disabled:
value = self.get_initial_for_field(field, name)
else:
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
try:
if isinstance(field, FileField):
initial = self.get_initial_for_field(field, name)
value = field.clean(value, initial)
else:
value = field.clean(value) # 将name和value增加到 self.cleaned_data 字典里面
self.cleaned_data[name] = value # 判断有没有 clean_字段 的函数 如果有 会覆盖上面self.cleaned_data对应的值
if hasattr(self, 'clean_%s' % name):
value = getattr(self, 'clean_%s' % name)()
self.cleaned_data[name] = value
except ValidationError as e:
# 如果验证错误 会把错误信息 加入到self.errors里面
self.add_error(name, e)
- is_valid
- 字段 = 默认正则表达式
- 额外的正则
from django.forms import Form
from django.forms import widgets
from django.forms import fields
from django.core.validators import RegexValidator class MyForm(Form):
user = fields.CharField(
validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
)
- clean_字段,必须返回值
- clean()
有返回值:cleaned_data = 返回值
无返回值:cleaned_data = 原来的值
from django.core.exceptions import ValidationError
class TestForm(Form):
user = fields.CharField(validators=[])
pwd = fields.CharField() #对单个字段做验证
def clean_user(self):
v = self.cleaned_data['user']
if models.Student.objects.filter(name=v).count():
raise ValidationError('用户名已经存在')
return self.cleaned_data['user'] def clean_pwd(self):
return self.cleaned_data['pwd'] #对整体所有的值做验证,如果数据库有值,抛异常
def clean(self):
user = self.cleaned_data.get('user')
email = self.cleaned_data.get('email')
if models.Student.objects.filter(user=user,email=email).count():
raise ValidationError('用户名和邮箱联合已经存在')
return self.cleaned_data def _post_clean(self):
"""
An internal hook for performing additional cleaning after form cleaning
is complete. Used for model validation in model forms.
"""
pass
Form 源码的更多相关文章
- 基于Django Form源码开发自定义Form组件
import copy import re class ValidateError(Exception): def __init__(self, detail): self.detail = deta ...
- form 源码刨析
def clean_name(self) value = self.cleaned_data.get('name') if "金-瓶-梅" not in value: raise ...
- 精读《React PowerPlug 源码》
1. 引言 React PowerPlug 是利用 render props 进行更好状态管理的工具库. React 项目中,一般一个文件就是一个类,状态最细粒度就是文件的粒度.然而文件粒度并非状态管 ...
- bootstrap源码分析之form、navbar
一.表单(Form) 源码文件:_form.scssmixins/_form.scss 1.按层次结构分:form-group -> form-control/input-group/form- ...
- Xamarin.Form 实例: Discuz BBS 客户端 源码分享
感谢台风, 这个十一长假让我好好的休息了一回, 睡觉到腰酸背疼, 看电影看到眼发红. 今天最后一天, 不敢出去逛, 不知道哪会还会下暴雨... 嗯嗯..这个项目其实在十一之前就开始了, 工作无聊,没有 ...
- 使用ajax方法实现form表单的提交(附源码)
写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...
- 一个普通的 Zepto 源码分析(一) - ie 与 form 模块
一个普通的 Zepto 源码分析(一) - ie 与 form 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核 ...
- 读Zepto源码之Form模块
Form 模块处理的是表单提交.表单提交包含两部分,一部分是格式化表单数据,另一部分是触发 submit 事件,提交表单. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...
- python---django中form组件(数据添加前使用自定义方法<django预留扩展点3个>进行验证,以及源码分析)
form组件代码: from app02.models import Userfrom django.core.exceptions import ValidationError class Ajax ...
随机推荐
- 解题:NOI 2014 购票
题面 观察一下部分分,我们发现链上的部分分是这样一个DP: $dp[i]=min(dp[i],dp[j]+dis(i,j)*p[i]+q[i])(dis(i,j)<=lim[i]\&\& ...
- 解题:NOI 2007 社交网络
题面 先跑一边Floyd乘法原理统计任意两点间最短路数目,然后再枚举一次按照题意即可求出答案,会写那道JSOI2007就会这个 #include<cstdio> #include<c ...
- bzoj3473: 字符串 && bzoj3277串
3473: 字符串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 121 Solved: 53[Submit][Status][Discuss] D ...
- BZOJ 1497 [NOI2006]最大获利
1497: [NOI2006]最大获利 Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前 ...
- [HAOI2011]防线修建
题目描述 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还犹豫不决,到底该把哪些城市作为保护对象呢?又由于 ...
- Python 爬虫入门(三)—— 寻找合适的爬取策略
写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...
- win8安装配置python2.7
安装python 1.下载python安装包,下载网站https://www.python.org/downloads 2.解压文件,双击python-2.7.13.amd64.msi进行安装pyth ...
- golang 性能测试pprof
golang 性能测试包是位于 net/http 包下的 pprof,其相关介绍可以参看具体的 官方文档 有关 golang 性能测试使用特别简单,在 main 包中的引包位置直接引入: import ...
- ASP.NET CORE API Swagger+IdentityServer4授权验证
简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置Id ...
- Openssh版本升级(Centos6.7)
实现前提公司服务器需要进行安全测评,扫描漏洞的设备扫出了关于 openssh 漏洞,主要是因为 openssh的当前版本为5.3,版本低了,而yum最新的openssh也只是5.3,没办法只能到 rp ...