自定制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_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)
自定制Form组件的更多相关文章
- BBS论坛 自定义form组件
二.自定义form组件 from django import forms from django.forms import widgets from app01 import models # 定制f ...
- python---django中form组件(2)自定制属性以及表单的各种验证,以及数据源的实时更新,以及和数据库关联使用ModelForm和元类
自定义属性以及各种验证 分析widget: class TestForm(forms.Form): user = fields.CharField( required = True, widget = ...
- Django之Form组件
Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功能: 生成HTML标签 验证用户 ...
- Python之路【第二十一篇】:Django之Form组件
Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1. ...
- 第十一篇:web之Django之Form组件
Django之Form组件 Django之Form组件 本节内容 基本使用 form中字段和插件 自定义验证规则 动态加载数据到form中 1. 基本使用 django中的Form组件有以下几个功 ...
- Web框架django[Form]组件
新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...
- 32.Django form组件
Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 创建Form类时,主要涉及到 [ ...
- python Django之Form组件
python Django之Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试 ...
- django Form组件
django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...
随机推荐
- BZOJ2761 不重复的数字 【treap】
2761: [JLOI2011]不重复数字 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 5517 Solved: 2087 [Submit][S ...
- UVA.839 Not so Mobile ( 二叉树 DFS)
UVA.839 Not so Mobile ( 二叉树 DFS) 题意分析 给出一份天平,判断天平是否平衡. 一开始使用的是保存每个节点,节点存储着两边的质量和距离,但是一直是Runtime erro ...
- HDOJ(HDU).1058 Humble Numbers (DP)
HDOJ(HDU).1058 Humble Numbers (DP) 点我挑战题目 题意分析 水 代码总览 /* Title:HDOJ.1058 Author:pengwill Date:2017-2 ...
- HDU1083 :Courses(二分图匹配)
Cources Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- tomcat log4j配置
tomcat默认的log使用的是java.util.logging,配置文件在${catalina_base}/conf/logging.properties tomcat日志分类, 1.access ...
- supervisor安装、配置和运行
supervisor是python写的进程管理工具,supervisor能够批量对进程执行启动,停止,重启等操作,有效提高了运维效率.注意supervisor只能管理前台进程,supervisor会自 ...
- HTML学习基本代码
HTML的代码比较繁琐,在此记下一些基本的东西,以后自己回来看看 <html> <head> <title>我的人生啊</title> <styl ...
- Small Multiple
题目描述 Find the smallest possible sum of the digits in the decimal notation of a positive multiple of ...
- rabbitmq使用命令创建交换机、队列及绑定
http://www.jusene.me/2018/02/20/rabbitmq-2/
- ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
21:09:22.221 [MessageBroker-3] INFO c.t.s.s.impl.StockNewsServiceImpl - [2017-12-16 21:09:22] execut ...