一般 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()])