form的valid验证的原理

form的valid验证的原理

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)

 

转载于:https://www.cnblogs.com/zhongbokun/p/8529434.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简介:完全通过html不需要写JS验证程序就可以实现表单验证功能,可支持一个表单元件多条件验证, 同一页面多表单可同时使用,和服务端程序无关系,完全客户端方式。 Demo1 基本使用方法 Demo2 自定义错误信息显示方式1 Demo3 自定义错误信息显示方式2/FV_onBlur.js插件演示 Demo4 所有判断规则 Demo5 自定义正则规则 Demo6 自定义函数规则 Demo7 自定义验证成功后处理方式 Demo8 结合jquery实现AJAX自定义验证 特性: 使用方法:在要验证的表单(form)中加上 onsubmit="return validator(this)" 在要验证的表单元件中设置元件,valid(验证规则),errmsg(提示消息),多个验证使用|作为分隔! 验证规则参数: required 必填 eqaul 和另一元件对比值是否相同,对比的元件名在元件加上属性eqaulName gt 和另一元件对比值是否大于另一元件值,对比的元件名在元件加上属性eqaulName isNumber 是否为数字 isInt 是否为整形 isTime 是否为时间格式 isDate 是否为日期格式 isEmail 必须是Email格式 isPhone 是否为电话号码 isMobile 是否为手机号码 isTelephone 是否为电话或手机号码 isIdCard 是否为身份证号码 isMoney 是否为货币值 isZip 是否是邮件编码 isQQ 是否是QQ isEnglish 是否是english isChinese 是否是中文 isUrl 是否是url compare 对比两个值 limit 长度限制 range 值范围限制 requireChecked 单选、复选框必须选择 filter 扩展名限制 isNo 值不等于 regexp 自定义正则判断 custom 自定义函数判断 更新历史: 1.0 disabled的元件不进行验证 比较大小判断的改正 增加了isTelephone决断,即电话验证可包括手机和市话 url规则支持https 增加了元件onblur即时提示错误信息的插件.FV_onBlur.js 0.6 手机号码添加了15开头的号码支持 。 0.5 修复了当元件名称出现数组形式[],在IE下出错问题。 0.4 修改了当errmsg不存在时出现的问题 修改了如果一个页面存在多个表单的自定义错误显示方式问题 添加了自定义验证成功后处理方式 0.3 加入十几种验证规则 加入自定义正则判断 加入自定义函数判断 加入将焦点移到第一个错误元件 0.2 加入自定义错误显示方式
layui form 主动验证是指在某些特定情况下,通过代码触发表单验证的过程。通常情况下,layui form 插件会在表单提交或输入框失焦时自动进行验证,然后根据验证结果显示错误提示信息。 但有时候,在某些需要实时验证的场景下,自动验证可能不够及时或不够准确。这时,可以使用 layui form 的主动验证功能来满足需求。 要进行主动验证,我们需要使用 layui 的 form 模块中的 verify 方法和验证表单的元素。 首先,在需要验证的表单元素上添加相应的验证规则,如必填字段、手机号码格式等。然后,通过监听表单的某个动作(如点击按钮、输入框改变等)触发验证的方法。 例如,我们可以使用如下代码实现表单提交时的主动验证: ```javascript //通过form模块的verify方法设定表单元素的验证规则 form.verify({ username: function(value, item){ //value:表单的值,item:表单的DOM对象 if(!value){ return '用户名不能为空'; } }, password: function(value, item){ if(!value){ return '密码不能为空'; } } }); //监听表单提交事件 form.on('submit(formDemo)', function(data){ if(form.verify()){ //使用form.verify()方法触发表单的主动验证 //验证通过后的操作 console.log(data.field); //获取表单数据 }else{ //验证不通过时的操作 } }); ``` 以上代码中,我们使用 form.verify() 方法触发表单的主动验证验证通过后才执行表单提交操作。在验证不通过时,可以根据需求进行相应的处理,如显示错误提示信息、阻止表单提交等。 总之,layui form 的主动验证功能可以帮助开发者实时地验证表单数据,提高用户的交互体验。通过监听表单动作触发验证方法,开发者可以根据具体需求灵活地应用主动验证功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值