基于Django Form源码开发自定义Form组件
2018-03-08 22:23
579 查看
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)
相关文章推荐
- python3开发进阶-Django框架中form的查看校验方法is_valid()的源码,自定义验证方法
- 一个简单的组件开发源码(自定义Picturebox)
- Django Form 自定义试用笔记(附工程源码下载)
- 基于Django的ModelForm组件(详解)
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- Django之利用type构造自定义Form组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- sharepoint 2013基于AD的Form表单登录(四)——开发自定义登录过程需要引用文件路径。
- python3-开发进阶Django-form组件中model form组件
- Django基于Pycharm开发之四[关于静态文件的使用,配置以及源码分析](原创)
- 基于vue2.0前端组件库element中 el-form表单 自定义验证填坑
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- Django 开发学习笔记(2)- 请求一个自定义的路径,得到一个返回
- 论坛源码推荐(3月10日):密码验证和强度评估 基于网易新闻的栏目组件
- 自定义组件开发 第二节 MXML组件开发
- Android开发——构建自定义组件
- Django基于Form之登录和注册
- Eclipse基于python、Django做Web开发