Tronado自定义Form组件

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

方式一:

  1. # ===========方式一================
  2. class Foo(object):
  3. user = 123
  4. def __init__(self):
  5. self.name = 123
  6. self.age = 456
  7. def aaa(self):
  8. self.name = 'sd'
  9. obj = Foo()
  10. # print(obj.__dict__) #获取对象属性
  11. # print(Foo.__dict__) #获取类里面的所有属性以及方法等

方式二:

  1. # ===============方式二==================
  2. class Foo2(object):
  3. A = 123
  4. def __init__(self):
  5. self.name = 'haiyan'
  6. self.age = 22
  7. # print(self.__class__.field) #获取当前类的
  8. def __new__(cls, *args, **kwargs):
  9. print(cls.__dict__)
  10. return object.__new__(cls)
  11.  
  12. Foo2()

二、自定义Form组件示例

  1. import re
  2. import copy
  3. class ValidateError(Exception) :
  4. '''自定义异常'''
  5. def __init__(self,detail):
  6. self.detail = detail
  7.  
  8. # ===========自定义插件===============
  9. class TextInput(object):
  10. def __str__(self):
  11. return '<input type="text">'
  12.  
  13. class EmailInput(object):
  14. def __str__(self):
  15. return '<input type="email">'
  16.  
  17. # ============字段:内部包含正则用于验证======================
  18. class Field(object):
  19. def __init__(self,required=True,error_message=None, widgets= None):
  20. self.required = required
  21. self.error_message = error_message
  22. if not widgets:
  23. self.widgets = TextInput() #设置默认
  24. else:
  25. self.widgets = widgets
  26.  
  27. def __str__(self):
  28. # return self.widgets
  29. return str(self.widgets) #将对象转成字符串
  30.  
  31. class CharField(Field):
  32.  
  33. def valid(self,val):
  34. if self.required:
  35. if not val:
  36. msg = self.error_message['required']
  37. raise ValidateError(msg) #调用自定义的异常
  38. return val
  39.  
  40. class EmailField(Field):
  41. ERG = "^\w+@\w+$"
  42. def valid(self,val):
  43. if self.required:
  44. if not val:
  45. msg = self.error_message['required']
  46. raise ValidateError(msg)
  47. # print(val, type(val))
  48. result = re.match(self.ERG,val)
  49. if not result:
  50. msg = self.error_message.get('invalid','格式错误')
  51. raise ValidateError(msg)
  52. return val
  53.  
  54. # ==========================
  55. class Form(object):
  56. def __init__(self,data):
  57. # print(UserForm.__dict__)#获取派生类中的所有静态字段
  58. # print(self.__class__.__dict__) #静态动态的获取类中的所有静态字段
  59. self.data = data
  60. self.fields = copy.deepcopy(self.__class__.declare_field) #获取字段
  61. self.clean_data = {}
  62. self.errors = {}
  63. def __new__(cls, *args, **kwargs): #在__new__里面也可以获取类中的所有静态字段
  64. declare_field = {}
  65. for field_name , field in cls.__dict__.items():
  66. # print(field_name,field)
  67. if isinstance(field,Field):
  68. declare_field[field_name] = field
  69. cls.declare_field = declare_field
  70. return object.__new__(cls) #创建对象
  71.  
  72. def is_valid(self):
  73. #用户提交的数据
  74. # self.data #{'username':"zzz","pwd":18}
  75. # self.fields #{'username': CharField(),"pwd": EmailField()}
  76. for field_name , field in self.fields.items():
  77. try:
  78. input_val = self.data.get(field_name)
  79. # print("---------------",field_name,input_val)
  80. val = field.valid(input_val) #内置的验证规则自己去验证
  81. method = getattr(self,"clean_%s"%field_name,None) #默认为None
  82. if method:
  83. val = method(val)
  84. self.clean_data[field_name] = val
  85. except ValidateError as e:
  86. self.errors[field_name] = e.detail
  87. return len(self.errors) ==0 #根据错误的返回,如果没有错误返回True,有错误返回False
  88.  
  89. def __iter__(self): ##########自定义生成标签3
  90. return iter(self.fields.values()) #返回的是一个迭代器
  91.  
  92. # =======================
  93. class UserForm(Form):
  94. username = CharField(error_message={'required': '用户名不能为空'}, widgets=TextInput())
  95. # email = EmailField(error_message={'required': '密码不能为空', 'invalid': '邮箱格式错误'}, widgets=EmailInput())
  96.  
  97. obj = UserForm(data={'username':"haiyan","email":"dsfsgd"})
  98. if obj.is_valid():
  99. print(obj.clean_data)
  100. else:
  101. print(obj.errors)
 
 

Tronado【第2篇】:tronado自定义Form组件的更多相关文章

  1. Tronado自定义Form组件

    Tronado自定义Form组件 一.获取类里面的静态属性以及动态属性的方法 方式一: # ===========方式一================ class Foo(object): user ...

  2. Flask学习【第10篇】:自定义Form组件

    wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  3. Flask【第10篇】:自定义Form组件

    自定义Form组件 一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: ...

  4. 仿照wtform自定义Form组件

    仿照wtforms自定义Form组件 1.wtforms 点击查看源码分析及使用方法 2.自定义Form组件 #!usr/bin/env python # -*- coding:utf-8 -*- f ...

  5. 自定义Form组件

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  6. BBS论坛 自定义form组件

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

  7. Python Web框架篇:Django Form组件

    Form简介 在HTTP中,表单(form标签),是用来提交数据的,其action属性说明了其传输数据的方法:如何传.如何接收. 访问网站时,表单可以实现客户端与服务器之间的通信.例如查询,就用到了表 ...

  8. Flask系列(十)自定义Form组件

    一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...

  9. 基于wtforms源码实现自定义form组件

    from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from w ...

随机推荐

  1. 双屏显示——NW.js

    1.利用w10中的双屏显示设置(扩展模式) 2.Code for second window: var gui = require('nw.gui'); gui.Screen.Init(); win ...

  2. 【内部】Fiddler设置代理请求的方式

    1.2 打开Fiiddler,设置如图步骤: 3.添加规则: 4.这里选择第三个选项: 5.选中^开始,空格结束的如图内容.复制你要代理的地址.如:http://wap.cmread.com/nap/ ...

  3. 安装opencv3.3.0碰到的问题及解决方法

    出处:http://osask.cn/front/ask/view/258965 CMakeError.log Compilation failed: source file: '/home/jhro ...

  4. JavaScript Array Reduce用于数组求和

    需求一 假设有一个数组,需要对其中的元素进行求和. const numbers = [1, -1, 2, 3]; 传统写法,使用for循环求和 const numbers = [1, -1, 2, 3 ...

  5. mysql——多表——合并查询结果

    合并查询结果 合并查询结果 是将多个select语句的查询结果合并到一起 union关键字,数据库会将所有的查询结果合并到一起,然后除掉相同的记录: union all关键字,只是简单的合并到一起 前 ...

  6. NFC读写器调试总结20191203

    以下为NFC读写器调试经验总结: 1.读写器部分,从TX1/TX2输出的13.56MHZ信号主要由L0/C0构成低通滤波器,用于滤除13.56MHZ的高次谐波,取值L0=1UH,C0=47PF时候,谐 ...

  7. HDU 1042 N!(高精度阶乘、大数乘法)

    N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submi ...

  8. property可以声明得位置

    property可以声明的位置有4处 1 @interface处 2 扩展处 3 protocol处 4 分类处 其中分类处的property不会合成实例变量,并且编译器也不会自动合成实例变量

  9. Redis 3主-3从集群的搭建(CentOS 7)

    注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...

  10. win10+vs2013+pcl1.8.0(x86) 环境配置遇到的各种小问题解决

    1.PCL提供了各自的PDB调试文件(解压后放入pcl安装目录的bin下) 2.OpenNI的安装需同其余在pcl第三方库文件夹下 3.添加附加依赖项的.lib文件请按照网上对应版本添加,另外需要每行 ...