zoukankan      html  css  js  c++  java
  • 基于Django Form源码开发自定义Form组件

    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)
  • 相关阅读:
    MySQL企业常用集群图解
    MySQL常见错误类型
    MySQL 数据库增量数据恢复案例
    异地备份同步校验脚本
    python 自动化之路 day 面向对象基础
    Docker 入门
    awk知识点总结
    Linux文件管理类命令及命令别名
    Linux重定向
    Linux进程管理
  • 原文地址:https://www.cnblogs.com/ctztake/p/8531234.html
Copyright © 2011-2022 走看看