zoukankan      html  css  js  c++  java
  • 自定制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)
  • 相关阅读:
    NUTCH Exception in thread "Thread-12751" java.lang.OutOfMemoryError: PermGen space
    未登录词识别
    中文分词索引
    hadoop 存储空间满了
    nutch 生产者队列的大小如何控制 threadcount * 50
    nutch 采集到的数据与实际不符
    nutch 采集效率--设置采集间隔
    异常: http://www.ly.com/news/visa.html: java.io.IOException: unzipBestEffort returned null
    hbase 取多个版本数据
    JavaScript制作时钟特效
  • 原文地址:https://www.cnblogs.com/supery007/p/8529584.html
Copyright © 2011-2022 走看看