自定制Form组件
代码
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组件的更多相关文章
- BBS论坛 自定义form组件
二.自定义form组件 from django import forms from django.forms import widgets from app01 import models # 定制f ...
- python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类
自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- Web框架django[Form]组件
新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...
- 32.Django form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
- python Django之Form组件
python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
随机推荐
- props设置state误区
class Component extends React.Component { constructor(props) { super(props); this.state = { value: t ...
- JavaScript去除数组中的重复值
用原型函数(prototype)可以定义一些很方便的自定义函数,实现各种自定义功能. Javascript 中的原型函数(prototype)的工作原理,在 javascript 中每次声明新函数的过 ...
- swift的一些东西
.cmd+k 键盘toggle .模拟器的handware设置ios键盘 .设置textfield的return类型为搜索 k.returnKeyType=UIReturnKeyType.search ...
- Base64 编解码
Base64编码简介 Base64用来将binary的字节序列数据编码成ASCII字符序列构成的文本.其使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符.另外 ...
- java 课后作业
杨辉三角 组合数 public class YH { public static void main(String agrs[]) { int a[5][5],i,j; for(i = 0;i < ...
- java nio buffer读取数据乱码问题
public static void main(String[] args) throws IOException { String charsetName = "GBK"; St ...
- mysql连接时权限问题 用户问题
启动工程时会连接mysql数据库,此时报错: ERROR 1044 (42000): Access denied for user 'pay'@'localhost' to database 'pay ...
- 数据结构:二维ST表
POJ2019 我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的 int N,B,K; ]; int val[maxn][maxn]; ][]; ][]; 这里的N是方阵的长宽 ...
- IntentServicce;Looper;long-running task
7. If you want to carry on a long-running task, what do you need to do? IntentService:Service Servic ...
- [Unity]游戏Inside中的Chromatic Aberration效果学习
Chromatic Aberration效果指的是模拟摄像机的拍摄瑕疵导致rgb三个通道的颜色发生了偏移,如 传统的Chromatic Aberration实现往往是基于一个后处理,将rgb采样的坐标 ...