您的位置:首页 > 编程语言 > Go语言

基于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)

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐