wtforms 原码流程 (I)

一般 wtforms 的使用方法,建一个类( class )继承 Form
example:

from wtforms import Form, StringField, validators, ValidationErrorclass ActionForm(Form):    action = StringField('action', [validators.Required()])

Form 继承 FormMeta("NewBase", (BaseForm), {})
FormMeta 继承 type

class Form(with_metaclass(FormMeta, BaseForm)):
class Form(FormMeta("NewBase", (BaseForm), {})):    pass
class FormMeta(type):    pass
FormMeta("NewBase", (BaseForm), {})

等价于

class NewBase(BaseForm):    pass

小结

Form 继承于 NewBase
NewBase 利用 metaclass 的方式继承于 BaseForm
利用 FormMeta __call__ 时会多创建 _unbound_fields (list) & _wtforms_meta (subclass)

不直接继承 BaseForm 而透过 FormMeta 继承

续 ...

example:

from wtforms import Form, StringField, validators, ValidationErrorclass ActionForm(Form):    action = StringField('action', [validators.Required()])

创建 ActionForm 时,产生 _unbound_fields (list) & _wtforms_meta (subclass)


一般利用Field建制表单的输入
example:

action = StringField('action', [validators.Required()])
class StringField(Field):    widget = widgets.TextInput()    pass

widget 用来产生 html 原码

class Field(object):    errors = tuple()    process_errors = tuple()    raw_data = None    validators = tuple()    widget = None    _formfield = True    _translations = DummyTranslations()    do_not_call_in_templates = True  # Allow Django 1.4 traversal    def __new__(cls, *args, **kwargs):        if '_form' in kwargs and '_name' in kwargs:            return super(Field, cls).__new__(cls)        else:            return UnboundField(cls, *args, **kwargs)

Field 在初始化(__init__)前会被创建(__new__),创建时若输入 (kwargs) 中不含有 _form and _name 则不会创建 Field 而是创建 UnboundField

小结

ActionForm 被初始化后,里面有

_unbound_fields (list)_wtforms_meta (subclass)UnboundField('action', [validators.Required()])

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章