import copy
import re class ValidateError(Exception):
def __init__(self, detail):
self.detail = detail # ###################### 插件
class TextInput(object):
def __str__(self):
return "<input type='text' />" class EmailInput(object):
def __str__(self):
return "<input type='email' />" # ###################### 内部包含正则,用于验证
class Fild(object):
def __init__(self,required=True,error_message=None,widget=None):
self.error_message=error_message
self.widget=widget
self.required=required def __str__(self):
return str(self.widget) class CharFiled(Fild):
def valid(self, val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg)
return val class EmailFiled(Fild):
REG = "^\w+@\w+$"
def valid(self, val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg)
result = re.match(self.REG, val)
if not result:
msg = self.error_message.get('invalid', '格式错误')
raise ValidateError(msg)
return val # ###################### Form,获取用户提交内容+获取定义的字段对象
class Form(object):
def __init__(self,data):
self.data=data
self.clean_data={}
self.errors={}
self.fields=copy.deepcopy(self.__class__.declare_field) def __new__(cls, *args, **kwargs):
declare_field={}
for field_name, field in cls.__dict__.items():
if isinstance(field,Fild):
declare_field[field_name]=field cls.declare_field=declare_field
return object.__new__(cls) def is_valid(self):
for field_name,field in self.fields.items():
try:
val=self.data.get(field_name)
field.valid(val)
method = getattr(self, "cleaned_%s" % field_name, None)
if method:
val=method(val)
self.clean_data[field_name]=val
except ValidateError as e:
self.errors[field_name] = e.detail return len(self.errors) == 0 def __iter__(self):
return iter(self.fields.values()) class UserForm(Form):
username=CharFiled(error_message={'required':'用户名不能为空'},widget=TextInput())
email=EmailFiled(error_message={'required':'邮箱不能为空','invalid':'格式错误'},widget=EmailInput()) #应用
form =UserForm(data={'username':'ctz','email':'ctz@123'}) if form .is_valid():
print('验证成功',form.clean_data)
else :
print('验证失败',form.errors)

基于Django Form源码开发自定义Form组件的更多相关文章

  1. 基于wtforms源码实现自定义form组件

    from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from w ...

  2. Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

    Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...

  3. Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

    目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax c ...

  4. 基于django的视频点播网站开发

    项目名称 基于django的视频点播网站开发 项目背景 学习完毕python和django之后,想找个项目练练手,本来想写个博客项目练手,无奈别人已经写过了,所以笔者就打算写一个视频点播网站,因为笔者 ...

  5. 修改VCL源码实现自定义输入对话框

    来自:https://yq.aliyun.com/wenji/88428 通过修改VCL源码实现自定义输入对话框 在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实I ...

  6. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  7. 带货直播源码开发采用MySQL有什么优越性

    MySQL是世界上最流行的开源关系数据库,带货直播源码使用MySQL,可实现分钟级别的数据库部署和弹性扩展,不仅经济实惠,而且稳定可靠,易于运维.云数据库 MySQL 提供备份恢复.监控.容灾.快速扩 ...

  8. Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

    原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...

  9. WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码

    OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...

随机推荐

  1. window service 创建

    1:vs中创建一个 window servece 2.右键 添加安装程序 3.更改属性视图中的Account属性为LocalService(本地服务) 更改ServiceName为你自己的服务名称   ...

  2. 禁止移动端input弹出软键盘

    在做三级联动,或者一些时间插件的时候总是弹出软键盘,用下面的方法就可以禁用掉,废话不多说直接上代码. HTML代码 <div class=""> <div> ...

  3. [BZOJ3523][Poi2014]KLO-Bricks——全网唯一 一篇O(n)题解+bzoj最优解

    Description 有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合 ...

  4. Numpy模块(数值计算)

    Numpy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...

  5. Apache 403 错误解决方法-让别人可以访问你的服务器(转)

    有一次做好了一个效果放在自己电脑的服务器上,让同学查看(同处于校园网中),却不知apache一直显示403 错误,对方没有权限访问,我知道这应该是配置文件httpd.conf中的问题,网上搜了一下其他 ...

  6. 什么是static?什么是final?

    由static修饰的变量.常量.和方法被称为是静态变量.常量和 方法. 静态数据和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以static声明并且实现,这样当需要使用时,直接使用类 ...

  7. Jokewithpermutation (DFS)

    Problem J. Jokewithpermutation Input file: joke.inOutput file: joke.out Joey had saved a permutation ...

  8. Desert King 最小比率生成树 (好题)

    Description David the Great has just become the king of a desert country. To win the respect of his ...

  9. udhcpd源码分析2--读取配置文件

    1:重要的结构体 读取配置文件信息到全局的结构体struct server_config_t server_config中,这个结构在很多文件中都有引用到很重要. /* dhcpd.h */ stru ...

  10. SSH 指定密钥,连接远程服务器。

    ssh -i /root/.ssh/private.pem user@192.168.1.100 -p 7744 如上, /root/.ssh/private.pem :密钥文件路径user@192. ...