Tronado自定义Form组件

一、获取类里面的静态属性以及动态属性的方法

方式一:

# ===========方式一================
class Foo(object):
user = 123
def __init__(self):
self.name = 123
self.age = 456
def aaa(self):
self.name = 'sd'
obj = Foo()
# print(obj.__dict__) #获取对象属性
# print(Foo.__dict__) #获取类里面的所有属性以及方法等

方式二:

# ===============方式二==================
class Foo2(object):
A = 123
def __init__(self):
self.name = 'haiyan'
self.age = 22
# print(self.__class__.field) #获取当前类的
def __new__(cls, *args, **kwargs):
print(cls.__dict__)
return object.__new__(cls) Foo2()

二、自定义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_message=None, widgets= None):
self.required = required
self.error_message = error_message
if not widgets:
self.widgets = TextInput() #设置默认
else:
self.widgets = widgets def __str__(self):
# return self.widgets
return str(self.widgets) #将对象转成字符串 class CharField(Field): def valid(self,val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg) #调用自定义的异常
return val class EmailField(Field):
ERG = "^\w+@\w+$"
def valid(self,val):
if self.required:
if not val:
msg = self.error_message['required']
raise ValidateError(msg)
# print(val, type(val))
result = re.match(self.ERG,val)
if not result:
msg = self.error_message.get('invalid','格式错误')
raise ValidateError(msg)
return val # ==========================
class Form(object):
def __init__(self,data):
# print(UserForm.__dict__)#获取派生类中的所有静态字段
# print(self.__class__.__dict__) #静态动态的获取类中的所有静态字段
self.data = data
self.fields = copy.deepcopy(self.__class__.declare_field) #获取字段
self.clean_data = {}
self.errors = {}
def __new__(cls, *args, **kwargs): #在__new__里面也可以获取类中的所有静态字段
declare_field = {}
for field_name , field in cls.__dict__.items():
# print(field_name,field)
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':"zzz","pwd":18}
# self.fields #{'username': CharField(),"pwd": EmailField()}
for field_name , field in self.fields.items():
try:
input_val = self.data.get(field_name)
# print("---------------",field_name,input_val)
val = field.valid(input_val) #内置的验证规则自己去验证
method = getattr(self,"clean_%s"%field_name,None) #默认为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 #根据错误的返回,如果没有错误返回True,有错误返回False def __iter__(self): ##########自定义生成标签3
return iter(self.fields.values()) #返回的是一个迭代器 # =======================
class UserForm(Form):
username = CharField(error_message={'required': '用户名不能为空'}, widgets=TextInput())
# email = EmailField(error_message={'required': '密码不能为空', 'invalid': '邮箱格式错误'}, widgets=EmailInput()) obj = UserForm(data={'username':"haiyan","email":"dsfsgd"})
if obj.is_valid():
print(obj.clean_data)
else:
print(obj.errors)
 
 

最新文章

  1. Asp.net MVC 视图(三)
  2. USACO section1.1 Broken Necklace
  3. 模拟alert和confirm
  4. EF执行存储过程
  5. BZOJ 3306 树
  6. Toad for Oracle 快捷键
  7. 【Ecstore2.0】计划任务/队列/导入导出 的执行问题
  8. 怎么改变Android手机里面文件的打开方式?包括文件管理器或者需要用到文件的APP
  9. Epipe
  10. ecshop点滴记录
  11. 【BZOJ3531】旅行(树链剖分,线段树)
  12. wireshark基础学习—第三部分wireshark的过滤器语法
  13. Xcode 添加pch 文件
  14. 关于Eclipse的一些简单设置
  15. vue webpack配置解决跨域问题
  16. C++获取MAC与IP
  17. openshift 容器云从入门到崩溃之四《配置用户验证》
  18. linux如何变更环境变量
  19. PHP7 学习笔记(六)403 Forbidden - WAMP Server 2.5
  20. Java之IO(六)FileInputStream和FileOutputStream

热门文章

  1. 实现Servlet接口
  2. cocos2dx[3.2](10) 新回调函数std::bind
  3. 学习Go语言(一)环境安装及HelloWorld
  4. 二叉搜索树倒序O(nlogn)建树
  5. ubuntu/work
  6. Luogu P1080 [NOIP2012]国王游戏
  7. python-day11(正式学习)
  8. C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
  9. Js和Jquery实现ajax长轮询
  10. npm 命令行基本操作