前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >仿照wtform自定义Form组件

仿照wtform自定义Form组件

作者头像
用户1214487
发布2018-01-24 09:42:09
6740
发布2018-01-24 09:42:09
举报
文章被收录于专栏:PythonPython

仿照wtforms自定义Form组件

1.wtforms

点击查看源码分析及使用方法

2.自定义Form组件

代码语言:javascript
复制
#!usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask,render_template,request,Markup
app = Flask(__name__,template_folder="templates")
app.debug = True
# ==============通过这几个类就可以显示了-==============
#插件
class Widget(object):
    pass

class InputText(Widget):
    def __call__(self, *args, **kwargs):

        return "<input type='text' name='name'>"

class TextArea(Widget):
    def __call__(self, *args, **kwargs):
        return Markup("<textarea name='email'></textarea>")

#Form
class BaseForm(object):
    def __init__(self):
        #获取当前所有的字段
        _fields = {}
        for name, field in self.__class__.__dict__.items():
            if isinstance(field, Field):  # 筛选出字段是name和emailDe
                _fields[name] = field
        self._fields = _fields
        self.data = {}
        # print(_fields)  # {'name': 111, 'email': 222}

    def validate(self,request_data):
        #先找到所有的字段,在执行每一个字段的validate方法
        flag = True
        for name, field in self._fields.items():
            input_val = request_data.get(name,"") #用户输入的值
            result= field.validate(input_val)  #每一个字段自己校验
            print("???????????",input_val,result)
            if not result:
                flag = False
            else:
                self.data[name] = input_val
        return flag
#字段
class Field(object):
    '''所有类的基类'''
    def __str__(self):          #python中的静态字段通过类能找到,通过对象也能找到
        return Markup(self.widget())  #self就是StringField,self

class StringField(Field):  #每个字段打印的时候都要去执行__str__,所以选择放在基类里面,自己没有就调用父类的
    widget = InputText()
    def validate(self,val):
        if val:
            return True

class EmaliField(Field):
    widget = TextArea()
    reg = ".*@.*"

    def validate(self,val):
        import re
        print(re.match(self.reg,val),"************")
        if re.match(self.reg,val):
            return True


# ===============使用===============
class LoginForm(BaseForm):
    name = StringField()
    email = EmaliField()

@app.route('/index', methods=["GET","POST"])
def index():
    form = LoginForm()
    ret = form.validate(request.form)
    print("验证成功",ret)
    print("验证成功的值",form.data)
    # print(form.name)
    # print(form.email)
    return render_template("index.html",form=form)

if __name__ == '__main__':
    app.run()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-01-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 仿照wtforms自定义Form组件
    • 1.wtforms
      • 2.自定义Form组件
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档