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. EasyUI 学习笔记

    EasyUI常见错误 1 . 无论是用HMTL形式实现组件还是使用代码 + HTML 形式实现组件 , 在为组件设置属性时 , 要注意属性值的类型问题 string:必须加引号 number:不加任何 ...

  2. Django Models相关

    Models的相关知识 1. AutoField:自增整数类型.根据 ID 自增长的 Int字段 2. IntegerField:整数类型 3. BigIntegerField:大整数类型.用于数值较 ...

  3. Square Root of Permutation - CF612E

    Description A permutation of length n is an array containing each integer from 1 to n exactly once. ...

  4. BZOJ5157 & 洛谷3970:[TJOI2014]上升子序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5157 https://www.luogu.org/problemnew/show/P3970 给定 ...

  5. Mac将应用拖入Finder工具栏

    在Finder的工具栏上放一下应用,方便打开对应的文件,可以 Command + 鼠标拖动应用,将应用拖入Finder工具栏中. 本人的Finder工具栏上添加了vscode这个应用

  6. Delight for a Cat

    Time Limit: 1000 ms Memory Limit: 512 MB Description ​ 从前,有一只懒猫叫CJB.每个小时,这只猫要么在睡觉,要么在吃东西,但不能一边睡觉一边吃东 ...

  7. JavaScript Date的原型方法扩展

    在JavaScript开发中,经常需要对Date类型的对象进行各种验证或格式化,但是js并没有提供那么多的那么细的函数,所以只好自己去用 prototype 扩充了,下面是我自己实现的Date类型常用 ...

  8. Ubuntu 14.04 64bit下Caffe + Cuda6.5/Cuda7.0 安装配置教程

    http://www.embeddedlinux.org.cn/emb-linux/entry-level/201612/21-6005.html 随着深度学习快速发展的浪潮,许多有兴趣的工作者都转入 ...

  9. SPOJ - HIGH :Highways (生成树计数)

    Highways 题目链接:https://vjudge.net/problem/SPOJ-HIGH Description: In some countries building highways ...

  10. DOM用TagName操作标签

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...