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. [剑指Offer] 55.链表中环的入口结点

    题目描述 一个链表中包含环,请找出该链表的环的入口结点. [思路]根据set集合的不重复,遍历链表时遇到的第一个重复结点就是环的入口结点. /* struct ListNode { int val; ...

  2. apiDoc 入门

    网站 http://apidocjs.com/#demo Install npm install apidoc -g Run apidoc -i myapp/ -o apidoc/ -t mytemp ...

  3. 使用Xcode进行调试

    目录 知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象(Enab ...

  4. Oracle 验证A表的2个字段组合不在B表2个字段组合里的数据

    select id, name from TAB_A t where not exists (select 1 from TAB_B t1 where t.id = t1.id and t.name ...

  5. 20165218 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.2 实验密级:Java开发环境的熟悉 实验内容.步骤与体会: ( ...

  6. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  7. B树,B+树,B*树简介

    B树(有些人也叫B-树) 是一种多路搜索树 : 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...

  8. iOS-防止向SQLite数据库中插入重复数据记录:

    原则:先检测该数据库的指定表中,是否已经存在我们要插入的这条数据记录,若已经存在,则不插入这条数据记录(即忽略此次插入操作),若尚不存在,才插入这条数据记录(即才执行此次插入操作) 我们这里使用的是F ...

  9. Ubuntu Android adb调试无法识别设备 -- List of devices attached ???????????? no permissions

    在Ubuntu下做Android开发, 使用adb devices调试的时候出现在面的错误: 这个问题之前就出现过的,突然就忘了,Mark一下.在网上找了一下,基本上是一些比较麻烦的办法,但是在我的记 ...

  10. FreeRTOS - configASSERT(断言)的使用

    原文地址:http://www.cnblogs.com/god-of-death/p/6891400.html  FreeRTOS中的断言函数configASSERT()和标准C中的断言函数asser ...