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. 使用tc来控制网络流量

    https://blog.csdn.net/qinyushuang/article/details/46611709 tc实际操控网络的流量 解释网络tc的架构,从架构上分析tc,与netfilter ...

  2. FLT_MIN,FLT_MAX,FLT_EPSILON

    FLT_MIN,FLT_MAX,FLT_EPSILON  * min positive value */最小的正值#define FLT_MIN 1.175494351e-38F /* max val ...

  3. dashboard and reporting Interface analysis

    dashboard and reporting Interface analysis > show system show system backup show system counters ...

  4. CentOS 文件及目录等

    1.在linux中一切皆是文件,只是类型不同,通过ls -l看到的一个字母表示文件的类型 -:普通文件. d:目录文件. l:链接文件. b:块设备文件. c:字符设备文件. p:管道文件. 2.文件 ...

  5. 【刷题】SPOJ 705 SUBST1 - New Distinct Substrings

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  6. 消息传递 树形DP

    非常妙的树形DP:由于n很小,我们可以枚举每一个点作为第一个节点,计算其时间花费 那么问题就转化为对于给点节点求花费时间. 通过观察,显然我们会发现先传给花费时间多的人更加合算,因为这样可以最大限度的 ...

  7. POJ2079:Triangle——题解

    http://poj.org/problem?id=2079 题目大意:求最大面积的三角形. —————————————————— 可以知道,最大面积的三角形的顶点一定是最大凸包的顶点. 接下来就是O ...

  8. 第一次BC

    BestCoder Round #90 1001 Kblack loves flag 太弱只写了这一道水题. 首先这个题面就是,完全不知道它在说什么.开始5mins后我还完全不知道这个题想要表达什么. ...

  9. 2 Advanced Read/Write Splitting with PHP’s MySQLnd

    原文地址需FQ才能看  https://blog.engineyard.com/2014/advanced-read-write-splitting-with-phps-mysqlnd In part ...

  10. mysql语句及执行计划

    数据库链接: mysql -uroot -p <!--数据库连接-->mysql -h10.0.0.100 -uuser -passwordshow databases <!--查看 ...