前言,我是作者之一,目前是WTForms的主要维护者
在我了解为什么我应该为使用WTForms的人们提到一个非常常见的模式之前,就是创建自己的模块,将所需的所有位组合成一个命名空间.
例如在myapp / forms.py中,您可以执行以下操作:
from wtforms.fields import *
from wtforms import widgets, Form as _Form
from wtforms.fields.html5 import EmailField,
class Form(_Form):
"""Awesome base form for myapp. Includes CSRF by default"""
class Meta:
csrf = True
csrf_secret = 'secretpasswordhere'
@property
def csrf_context(self):
return get_current_request().session
# maybe add some methods you really wanted to have on your Form class
您可以使用以上内容:
from myapp.forms import Form, TextField, EmailField, ...
class UserForm(Form):
name = TextField(...)
email = EmailField(...)
或者像myapp.forms import *一样进行星形导入
您将注意到我还包括一个自定义表单子类,它设置CSRF并默认提供CSRF上下文,这不是绝对必要的. (顺便说一下,如果您使用的是烧瓶,Flask-WTF会为您设置类似的CSRF,但重点是说明如何轻松实现自己的集成.)
现在为什么.
WTForms的核心思想是提出一个非常简单,可靠的框架,适用于大多数用例,但是可扩展性足以让人们可以提供配套工具来处理特定的用例.
在早期,这样做的解决方案是将extensions与各种库互操作合并.但这带来了一个问题,因为它极大地增加了测试的复杂性和表面区域,而且它会以奇怪的方式驱动WTForms版本(Django只是改变了这一点,现在你需要发布一个新的WTForms).所以在2015年,我们决定将所有扩展移动到他们自己的包中,以允许他们自己的发布时间表.
与其强迫人们使用一个试图完成所有事情的单个软件包,这已经形成了一个真正伟大的生态系统,其中包括Flask-WTF,WTForms-Alchemy和WTForms-Django等固体配套软件包.
至于HTML5类型没有记录的原因;好吧,这是一个遗漏.还有一些历史:在某些时候,我们将默认的WTForms字段输出从XHTML样式切换为HTML紧凑语法;但保留了核心领域的产出.因此,我们让人们回馈XHTML表单,人们贡献html5字段,以及希望默认字段使用HTML5类型的人,所有这些都在我们保证在主要版本中的向后兼容性之后,这迫使我们的手.
我知道这是一个很长的答案,也许简短的说法是:虽然WTForms通常可以与大多数Web框架一起使用,但它的设计是根据您的用途进行配置和定制的.一切都不插即用.