代码

import re
import copy 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 Field(object):
def __init__(self,required=True,error_messages=None,widget=None):
self.required = required
self.error_messages = error_messages
if not widget:
self.widget = TextInput()
else:
self.widget = widget
def __str__(self):
return str(self.widget) class CharField(Field): def valid(self,val):
if self.required:
if not val:
msg = self.error_messages['required']
raise ValidateError(msg)
return val class EmailField(Field):
REG = "^\w+@\w+$" def valid(self,val):
if self.required:
if not val:
msg = self.error_messages['required']
raise ValidateError(msg)
result = re.match(self.REG,val)
if not result:
msg = self.error_messages.get('invalid','格式错误')
raise ValidateError(msg)
return val # ###################### Form,获取用户提交内容+获取定义的字段对象
class Form(object): def __init__(self,data=None):
# 获取派生类中的所有静态字段
# print(self.__class__.__dict__)
self.data = data
self.fields = copy.deepcopy(self.__class__.declare_field)
self.cleaned_data = {}
self.errors = {} def __new__(cls, *args, **kwargs):
declare_field = {}
for field_name, field in cls.__dict__.items():
if isinstance(field,Field):
declare_field[field_name] = field
cls.declare_field = declare_field
return object.__new__(cls) def is_valid(self):
# 用户提交的数据
# self.data # {"username":"alex","pwd":18,'xxx':11}
# self.fields # {"username":CharField(), "pwd": EmailField() }
for field_name,filed in self.fields.items():
try:
input_val = self.data.get(field_name)
val = filed.valid(input_val)
method = getattr(self,"cleaned_%s" %field_name,None)
if method:
val = method(val)
self.cleaned_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 = CharField(error_messages={'required':'用户名不能为空'},widget=TextInput())
pwd = EmailField(error_messages={'required':'密码不能为空','invalid':'密码格式错误'},widget=EmailInput()) # ############### 应用
obj = UserForm(data={"username":"sdf","pwd":"sdf",'xxx':666})
if obj.is_valid():
print('验证成功',obj.cleaned_data)
else:
print("验证失败",obj.errors) # ##################### HTML #####################
for x in obj:
print(x)

自定制Form组件的更多相关文章

  1. BBS论坛 自定义form组件

    二.自定义form组件 from django import forms from django.forms import widgets from app01 import models # 定制f ...

  2. python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类

    自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...

  3. Django之Form组件

    Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...

  4. Python之路【第二十一篇】:Django之Form组件

    Django之Form组件   Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...

  5. 第十一篇:web之Django之Form组件

    Django之Form组件   Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...

  6. Web框架django[Form]组件

    新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...

  7. 32.Django form组件

    Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...

  8. python Django之Form组件

    python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...

  9. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

随机推荐

  1. HDOJ(HDU).1015 Safecracker (DFS)

    HDOJ(HDU).1015 Safecracker [从零开始DFS(2)] 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HDOJ.1 ...

  2. 用ByteArrayOutputStream解决IO流乱码问题

    IO中用ByteArrayOutputStream解决乱码问题 --另一种解决乱码的方法 IO中另外一种防止乱码的方法:使用ByteArrayOutputStream在创建ByteArrayOutpu ...

  3. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

  4. UIScrollView控件及其三个常用属性:contentSize、contentInset和contentOffset

    如果您对UIScrollView控件感到难以理解,下面是本人自己对UIScrollView控件的理解方式,按照我的思路,理解UIScrollView控件非常容易! 我对UIScrollView的构成理 ...

  5. Idrac6 to manage dell server

    最近idrac6挂了,java已经升级了 1.安装firefox浏览器,只有火狐是支持idrac最好的 2.安装JDK 3.配置configure java, 4.添加security,edit si ...

  6. 你还在用notifyDataSetChanged?

    想到发这篇帖子是源于我的上一篇帖子#Testin杯#多线程断点续传后台下载 .帖子中讲述的项目使用了listView这个控件,而且自定义了adapter.在更新item的进度条时发现每次使用notif ...

  7. React Mixin

    为什么使用 Mixin ? React为了将同样的功能添加到多个组件当中,你需要将这些通用的功能包装成一个mixin,然后导入到你的模块中. 可以说,相比继承而已,React更喜欢这种组合的方式. 写 ...

  8. angularJs $resource自定义方法(待完善)

    配置CompanyService var services = angular.module('liaoyuan.services'); services.factory('CompanyServic ...

  9. 安装显卡后蓝屏0x00000116解决办法

    1. 亲自遇到蓝屏的问题. 2. 进入安全模式后重装系统,成功. 3. 安装驱动,软件没毛病.安装显卡驱动后,蓝屏. 4. 查看蓝屏错误代码0x00000116, 百度后查看到是显卡驱动的问题. 5. ...

  10. 【bzoj3476-懒惰的奶牛】线段树

    题解: 感觉这题和别人的做法不一样...呵呵呵...调了一百年.. 设家坐标为(a,b),对于每个点(x,y),可以转化为|a-x|+|b-y|<=k 对于每个点,它的影响范围是一个菱形(也就是 ...