tornado自定义Form组件

一、获取类里面的静态属性以及动态属性的方法

方式一:

# ===========方式一================
class Foo(object):
    user = 123
    def __init__(self):
        self.name = 123
        self.age = 456
    def aaa(self):
        self.name = ‘sd‘
obj = Foo()
# print(obj.__dict__)  #获取对象属性
# print(Foo.__dict__) #获取类里面的所有属性以及方法等

方式二:

# ===============方式二==================
class Foo2(object):
    A  = 123
    def __init__(self):
        self.name = ‘haiyan‘
        self.age = 22
        # print(self.__class__.field)  #获取当前类的
    def __new__(cls, *args, **kwargs):
        print(cls.__dict__)
        return object.__new__(cls)

Foo2()

二、自定义Form组件示例

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_message=None, widgets= None):
        self.required = required
        self.error_message = error_message
        if not widgets:
            self.widgets = TextInput()  #设置默认
        else:
            self.widgets = widgets

    def __str__(self):
        # return self.widgets
        return str(self.widgets)  #将对象转成字符串

class CharField(Field):

    def valid(self,val):
        if self.required:
            if not val:
                msg = self.error_message[‘required‘]
                raise ValidateError(msg)  #调用自定义的异常
        return val

class EmailField(Field):
    ERG = "^\[email protected]\w+$"
    def valid(self,val):
        if self.required:
            if not val:
                msg = self.error_message[‘required‘]
                raise ValidateError(msg)
        # print(val, type(val))
        result = re.match(self.ERG,val)
        if not result:
            msg = self.error_message.get(‘invalid‘,‘格式错误‘)
            raise ValidateError(msg)
        return val

# ==========================
class Form(object):
    def __init__(self,data):
        # print(UserForm.__dict__)#获取派生类中的所有静态字段
        # print(self.__class__.__dict__)  #静态动态的获取类中的所有静态字段
        self.data = data
        self.fields = copy.deepcopy(self.__class__.declare_field)  #获取字段
        self.clean_data = {}
        self.errors = {}
    def __new__(cls, *args, **kwargs):  #在__new__里面也可以获取类中的所有静态字段
        declare_field = {}
        for field_name , field in cls.__dict__.items():
            # print(field_name,field)
            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‘:"zzz","pwd":18}
        # self.fields #{‘username‘: CharField(),"pwd": EmailField()}
        for field_name , field in self.fields.items():
            try:
                input_val = self.data.get(field_name)
                # print("---------------",field_name,input_val)
                val = field.valid(input_val)  #内置的验证规则自己去验证
                method = getattr(self,"clean_%s"%field_name,None)  #默认为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 #根据错误的返回,如果没有错误返回True,有错误返回False

    def  __iter__(self):  ##########自定义生成标签3
        return iter(self.fields.values())  #返回的是一个迭代器

# =======================
class UserForm(Form):
    username = CharField(error_message={‘required‘: ‘用户名不能为空‘}, widgets=TextInput())
    # email = EmailField(error_message={‘required‘: ‘密码不能为空‘, ‘invalid‘: ‘邮箱格式错误‘}, widgets=EmailInput())

obj = UserForm(data={‘username‘:"haiyan","email":"dsfsgd"})
if obj.is_valid():
    print(obj.clean_data)
else:
    print(obj.errors)

原文地址:https://www.cnblogs.com/zcfx/p/11326388.html

时间: 2024-11-09 06:27:49

tornado自定义Form组件的相关文章

Flask 【第十篇】自定义Form组件

一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._wtforms_meta中 2. 执行构造方法 a. 循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到 self._fields[name] 中. 即: _fields = { name: wtforms.fields.core.StringField

自定义form组件

一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._wtforms_meta中 3 2. 执行构造方法 4 5 a. 循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到 self._fields[name] 中. 6 即: 7 _fields = { 8 name: wtforms.fields.

Flask学习【第10篇】:自定义Form组件

wtforms源码流程 实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._wtforms_meta中 3 2. 执行构造方法 4 5 a. 循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到 self._fields[name] 中. 6 即: 7 _fields = { 8 name: wtforms.fields.core

Flask系列(十)自定义Form组件

一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._wtforms_meta中 2. 执行构造方法 a. 循环cls._unbound_fields中的字段,并执行字段的bind方法,然后将返回值添加到 self._fields[name] 中. 即: _fields = { name: wtforms.fields.core.StringField

基于wtforms源码实现自定义form组件

from flask import Flask,Markup,render_template,request,redirect from wtforms.form import Form from wtforms.fields import core from wtforms import widgets #插件 class Widget(object): pass class TextInput(): def __call__(self, *args, **kwargs): return "&

Django的form组件应用登陆或者注册

from django import forms from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.exceptions import ValidationError from blog.models import * class RegisterForm(Form): # 自定义form组件 username = fiel

Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合

Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合 一丶FORM的介绍 1.生成页面可用的HTML标签 2.对用户提交的数据进行校验 3.保留上次输入内容 二丶使用form组件实现注册功能 from django import forms # 导入forms组件 # 按照Django form组件的要求自己写一个类 class RegForm(forms.Form): # 继承Form name = forms.Ch

Django 批量插入数据、自定义分页器、多表关系的建立及Form组件(待更新。。。)

目  录 django批量出入数据 自定义分页器 创建多对多表关系的建立 form组件 form组件钩子函数 一.django批量出入数据 视图函数: from app01 import models # 向表中插入1000条数据 def index(request): # 方式1: # for i in range(1000): # models.Book.objects.create(title='第%s本书'%i) # book_Queryset = models.Book.objects

form组件使用、常用字段、字段参数、自定义校验规则:

views: from django.shortcuts import render,HttpResponse # Create your views here.def reg(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") if len(pwd) <= 6: return render(