# encoding=utf-8
from app.models import Student
from flask import g import re
from flask.ext.wtf import Form
from wtforms import StringField, RadioField, PasswordField, TextAreaField, BooleanField, DateField, ValidationError, \
IntegerField
from wtforms.validators import DataRequired, Length, Regexp, Email, EqualTo
from wtforms.widgets import ListWidget, HTMLString class BSListWidget(ListWidget):
def __call__(self, field, **kwargs):
kwargs.setdefault('id', field.id)
html = ""
for subfield in field:
html += u'<label class="radio-inline"> %s%s </label>' % (subfield(), subfield.label.text)
return HTMLString(html) class Fields(object):
notnull = u'该项输入不能为空' def get_len_str(min=None, max=None):
if min and not max:
return u"该项输入的最小长度必须是%d" % min
elif max and not min:
return u"该项输入的最大长度必须是%d" % max
else:
return u'该输入的长度必须大于%d,小于%d' % (min, max) username = StringField(label=u'请输入您的用户名',
validators=[DataRequired(message=notnull),
Length(min=0, max=15, message=get_len_str(0, 16)),
]) password = PasswordField(label=u'请输入密码', description=u'请输入密码',
validators=[DataRequired(message=notnull),
Length(min=0, max=60, message=get_len_str(min=0, max=61)),
])
confirm_password = PasswordField(label=u'请确认密码',
description=u'请确认密码', validators=[DataRequired(message=notnull),
Length(min=5, max=60, message=get_len_str(min=4, max=61)),
EqualTo(u'confirm_password', message=u'两次输入的密码不一致'), ]
)
student_amount = StringField(label=u'请输入您指导的学生数量',
validators=[Regexp(re.compile(r"\d"))]) is_active = RadioField(label=u'是否激活账户',
coerce=int,
choices=[(0, u'否'), (1, u'是')],
default=0,
widget=BSListWidget()) notice = TextAreaField(label=u'请填写对学生的通知') attachment = StringField(label=u'添加附加',
validators=[Length(min=0, max=32, message=get_len_str(min=0, max=33))], ) is_comment_teacher = RadioField(label=u'是否有评价功能',
coerce=int,
choices=[(0, u'否'), (1, u'是')],
default=0,
widget=BSListWidget()) student_name = StringField(label=u'请输入您的姓名',
description='',
validators=[DataRequired(message=notnull),
Length(min=0, max=15, message=get_len_str(0, 16)),
]) sex = RadioField(label=u'您的性别',
coerce=int,
choices=[(0, u'男'), (1, u'女')],
default=0,
widget=BSListWidget()) user_type = RadioField(label=u'您是',
coerce=str,
choices=[(u'student', u'学生'), (u'teacher', u'老师'), (u'admin', u'管理员')],
default=u'student',
widget=BSListWidget()) mark = StringField(label=u'您的分数',
default=0,
validators=[DataRequired(message=notnull),
Length(min=0, max=100, message=get_len_str(0, 101)),
])
comment = TextAreaField(label=u'请填写您对学生的评语',
validators=[
Length(min=0, max=128, message=get_len_str(0, 129)),
]) title = StringField(label=u'请填写毕业设计的题目',
validators=[
Length(min=0, max=128, message=get_len_str(0, 129)),
])
description = TextAreaField(label=u'请填写毕业设计的描述') task_start_date = DateField(label=u'开始时间')
task_end_date = DateField(label=u'结束时间') comment_start_date = DateField(label=u'开始时间')
comment_end_date = DateField(label=u'结束时间') class LoginForm(Form):
username = Fields.username
password = Fields.password user_type = Fields.user_type remember_me = BooleanField(label=u'记住我', default=u'y') errors = {} def validate_fields(self):
status = True
status = status and self.username.validate(self)
status = status and self.username.validate(self)
self.password.validate() # def validate(self):
self._fields
self.validate_on_submit()
return self.username.validate(self) # def validate_username(self, field):
# user = Student.get_user(field.data)
# if not user:
# print 'not user'
# self.errors['username'] = u'用户名不存在'
# raise ValidationError(message=u'该用户名已被注册')
# else:
# print 'user'
# return True #
# def validate_password(self,field):
# if g.user:
# if field.data != g.user.username:
# field.errors.append(message=u'用户密码不正确')
# return False
#
# def validate_user_type(self, field):
# print field.data
#
# def validate_remember_me(self,field):
# if field.data:
# print field.data class StuInfo(Form):
username = Fields.username
student_name = Fields.student_name
sex = Fields.sex
attachment = Fields.attachment
mark = Fields.mark
comment = Fields.comment class BaseForm(object):
def __init__(self, form):
self.username = Field(label=u'用户名', type='text', validators={'min_length': 5}) for field_name, data in form.items():
getattr(self, field_name).data = data def validate(self):
status = True
for field_name in self.__dict__:
status = status and getattr(self, field_name).validate()
return status class Field(object):
def __init__(self, label=None, type='text', validators={}, description=None, data=''):
self.data = data
self.label = label
self.type = type
self.validators = validators
self.description = description def validate(self):
status = True
for method_name, param in self.validators.items():
print method_name, param
status = status and getattr(self, method_name)(param)
return status def is_null(self, status):
if status:
return True
if not self.data:
return False
if hasattr(self.data, 'replace') and len(self.data.replace(' ', '')) > 0:
return False
if len(self.data) == 0:
return False
return True def min_length(self, min=-1):
if not self.is_null(False) and len(self.data) < min:
return False
return True def max_length(self, max):
if not self.is_null(False) and len(self.data) > max:
return False
return True def min(self, min):
try:
if int(self.data) < min:
return False
return True
except Exception, e:
print e
return False def max(self, max):
try:
if int(self.data) > max:
return False
return True
except Exception, e:
print e
return False def equal_to(self, data):
if self.data != data:
return False
return True def select_from(self, *args):
if self.data not in args:
return False
return True if __name__ == '__main__':
b = BaseForm({'username': 'o'})
print b.validate()
print 'ok'

 

python实现简单表单校验框架的更多相关文章

  1. Spring MVC 文件上传、Restful、表单校验框架

    目录 文件上传 Restful Restful 简介 Rest 行为常用约定方式 Restful开发入门 表单校验框架 表单校验框架介绍 快速入门 多规则校验 嵌套校验 分组校验 综合案例 实用校验范 ...

  2. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件

    表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...

  3. Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  4. Vee-validate 父组件获取子组件表单校验结果

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  5. JEECG 3.7.8 新版表单校验提示风格使用&升级方法(validform 新风格漂亮,布局简单)

    JEECG 表单校验采用的是validform,默认的校验提示需要占用页面布局,提示效果较传统.jeecg这个自定义的校验提示风格,不占用页面布局,提示效果也更美观,简单易用,让表单看起来更漂亮!!! ...

  6. 简单好用的表单校验插件——jQuery Validate基本使用方法总结

    jquery validate当前最新版本是1.17.0,下载链接是:https://github.com/jquery-validation/jquery-validation/releases/t ...

  7. easyui 进阶之表单校验、自定义校验

    前言 easyui是一种基于jQuery的用户界面插件集合,它为创建现代化,互动,JavaScript应用程序,提供必要的功能,完美支持HTML5网页的完整框架,节省网页开发的时间和规模.非常的简单易 ...

  8. js--吐血总结最近遇到的变态表单校验---element+原生+jq+easyUI(前端职业生涯见过的最烦的校验)

    最近写了无数各种形式的表单,记录下奇奇怪怪的校验规则~ 一:首先是element自带的rules校验规则: element作为常用框架,自带rules属性简单易懂,官方文档一目了然,不再赘述,应付常用 ...

  9. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

随机推荐

  1. event和window.event

    type:事件的类型,如onlick中的click:srcElement/target:事件源,就是发生事件的元素:button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下 ...

  2. dede调用指定栏目的标签

    {dede:type typeid='1'} <a href="[field:typelink /]">[field:typename /]</a> {/d ...

  3. robot自动化测试(一)---安装

    1.安装python 百度搜索安装程序即可:我安装的python 2.7.6 64位 2.安装wxpython 版本:wxPython2.8 下载地址:http://sourceforge.net/p ...

  4. 使用ARM模板部署自动扩展的Linux VMSS(1)

    在Azure之前的ASM版本或者经典模式中,用户使用Azure Website,Azure Cloud Service等PAAS服务,可以实现一定程度上的自动扩展(auto scaling),但有着诸 ...

  5. 【转】WPF - 第三方控件

    WPF - 第三方控件 目前第三方控件在网上形成巨大的共享资源,其中包括收费的也有免费的,有开源的也有不开源的,合理的使用第三方控件将使项目组的工作事半功倍.比如项目中有些复杂的业务逻辑.有些绚丽的效 ...

  6. thinkphp项目目录

    #   ThinkPHP核心文件介绍        ├─ThinkPHP.php     框架入口文件    ├─Common 框架公共文件    ├─Conf 框架配置文件    ├─Extend ...

  7. USB信号是什么类型的? 为什么在D+,D-处要接上拉下拉电阻呢,具体阻值要如何计算

    USB协议要求的,1.5K上拉在D+时表示是全速设备,在D-表示不是全速设备有些方案里面(比如PNX5230)推荐D+/D-接下拉1M的电阻是为了提高数据传输稳定性的 ①  usb有主从设备之分,主设 ...

  8. C# Struct结构体

    C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括数据成员和方法成员. 结构和类的区别: 1.结构是值类型,它在栈中分配空间:而类是引用类型,它在堆中分配空间,栈中保存的只是引用 ...

  9. Robot Framework 安装AutoItLibrary

    1. 下载AutoItLibrary-1.1_x64包,http://code.google.com/p/robotframework-autoitlibrary/ 2. 安装pywin32库,htt ...

  10. 格而知之7:我所理解的Runtime(2)

    消息发送(Messaging) 8.以上便是runtime相关的一些数据结构,接下来我们回看一开始的疑问: objc_msgSend()函数在执行的过程中是如何找到对应的类,找到对应的方法实现的呢? ...