目录

笨方法实现webpy的表单校验功能

目录

最近在写一个小的demo,简单的用户注册与登录,检查在注册的时候要先检测用户名是否已经存在了,还要检查一下密码长度要不得小于3个字符

检查用户是否存在我是写在了一个单独的model.py里

1
2
3
4
5
6
def check(uname):
info = db.select('pytest',where="username=$uname",vars=locals())
if len(info)>0:
return False
else:
return True

这里的return True与False与实际的是相反的,这里后面做校验操作的时候做说明

官方的文档中有写校验的说明,但写的比较笼统,但是有一点写到了表单的校验

1
2
3
4
5
vpass = form.regexp(r".{3,20}$", 'must be between 3 and 20 characters')
vemail = form.regexp(r".*@.*", "must be a valid email address")

validators = [
        form.Validator("Passwords did't match", lambda i: i.password == i.password2)]

vpass 是通过正则表达式来校验密码长度在3-20位,

vmail是校验邮箱格式的正确性,要有一个@符

而下面的validators则是由一个form.Validator生成的列表类

我通过这里的lambda函数想到了对表单的校验

1
2
3
4
5
validators=[
        form.Validator(u'用户名不能为空',lambda i:len(i.username)>0),
        form.Validator(u'用户名已经存在',lambda i:model.check(i.username)),
        form.Validator(u'两次输入的密码不一致',lambda i:i.pwd==i.pwd2),
    ]

这里的model.check就是调用上面写的函数,如果有,则返回False,触发’用户名已经存在’条件

另外,我看form.py里有一个变量 notnull = Validator(“Required”, bool),也可以直接调用这个变量,但是它的提示文字是Required,这里可以初始化一个中文的提示

1
form.Textbox('username',form.Validator(u"必填", bool),description=u'用户名(*)')

最终我写的这个表单是这个样子的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
##表单校验
vpass = form.regexp(r".{3,20}$", u'密码长度不得小于3位')

reg_form = form.Form(
    # form.Textbox('username',form.Validator(u"必填", bool),description=u'用户名(*)'),
    form.Textbox('username',description=u'用户名(*)'),
    form.Password('pwd',vpass,description=u'密码'),
    form.Password('pwd2',description=u'重复密码'),
    form.Button('submit',type='submit',html=u'注册'),
    validators=[
        form.Validator(u'用户名不能为空',lambda i:len(i.username)>0),
        form.Validator(u'用户名已经存在',lambda i:model.check(i.username)),
        form.Validator(u'两次输入的密码不一致',lambda i:i.pwd==i.pwd2),
    ]
    )

validators里我不知道还是否有别的调用接收表单值的方法,我尝试过

1
form.Validator(u'用户名不能为空',len(web.input().get('username'))>0)

但是这个在模板form.render()中就会报错,所以现在还是先以这种笨方式简单的调用表单校验吧!

  • 文章标题: 笨方法实现webpy的表单校验功能
  • 本文作者: 杨彦星
  • 本文链接: https://www.yangyanxing.com/article/1340.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。