我正在使用Flask开发Web应用程序.我原来是手动编写HTML表单,然后切换到使用WTForms(这是一个教育项目,所以我展示了构建项目的每一步).
尝试添加HTML5表单字段时,我有点困惑,比如EmailField.我搜索了WTForms文档,并在线搜索,我无法找到如何使用HTML5 EmailField创建WTForm.
然后我安装了这个模块https://pypi.python.org/pypi/wtforms-html5,允许它,一切正常.但是我对添加额外的依赖感到不满意,特别是因为它似乎没有积极开发(https://github.com/brutus/wtforms-html5).
然后我结束了WTForms github页面,发现实际上支持所有新的HTML5字段,但默认情况下不会导入这些字段.https://github.com/wtforms/wtforms/blob/master/wtforms/fields/html5.py因此,而不是使用
from WTForms import EmailField
正如人们所推断的那样
from WTForms import TextField
一个人必须使用
from wtforms.fields.html5 import EmailField
我以前使用wtforms-html5模块如下
from wtforms_html5 import EmailField
因此,我更改了所有出现的内容wtforms_html5
,wtforms.fields.html5
并且我的应用程序完全按预期工作.
好的,感谢您阅读所有背景资料.现在提问:
为什么WTForms文档中没有提到任何html5字段(EmailField,DateField等)?
为什么这些字段默认情况下不会像其他字段一样导入WTForms
这些字段是否稳定/打算使用?
从WTForms导入字段的最佳做法是什么?
对于Text字段,我可以使用以下任何一种方法:
from wtforms import TextField from wtforms.fields import TextField from wtforms.fields.simple import TextField
但对于EmailField,我必须使用
from wtforms.fields.html5 import EmailField
我想要:
from wtforms.fields import TextField from wtforms.fields import EmailField
但是这需要在fields [__init__][1]
文件中添加一行,我不愿意这样做,因为它是一个教育项目,这只会让学习者感到困惑.
我在寻找
洞察为什么WTForms不记录或默认导入html5字段
有任何理由继续使用wtforms-html5第三方模块.
Crast.. 8
前言,我是作者之一,目前是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(...)
或者像星球一样进口 from myapp.forms import *
您将注意到我还包括一个自定义表单子类,它设置CSRF并默认提供CSRF上下文,这不是绝对必要的.(顺便说一句,如果您使用的是烧瓶,Flask-WTF会为您设置类似的CSRF设置,但重点是说明如何轻松实现自己的集成.)
现在为什么.
WTForms的核心思想是提出一个非常简单,可靠的框架,适用于大多数用例,但是可扩展性足以让人们可以提供配套工具来处理特定的用例.
在早期,这样做的解决方案是将interop的扩展与各种库结合在一起.但这带来了一个问题,因为它极大地增加了测试的复杂性和表面区域,而且它会以奇怪的方式驱动WTForms版本(Django只是改变了这一点,现在你需要发布一个新的WTForms).所以在2015年,我们决定将所有扩展移动到他们自己的包中,以允许他们自己的发布时间表.
与其强迫人们使用一个试图完成所有事情的单一软件包,这已经形成了一个真正伟大的生态系统,其中包括Flask-WTF,WTForms-Alchemy和WTForms-Django等坚实的配套软件包.
至于HTML5类型没有记录的原因; 好吧,这是一个遗漏.还有一些历史:在某些时候,我们将默认的WTForms字段输出从XHTML样式切换为HTML紧凑语法; 但保留了核心领域的产出.因此,我们让人们回馈XHTML表单,人们贡献html5字段,以及希望默认字段使用HTML5类型的人,所有这些都在我们保证在主要版本中的向后兼容性之后,这迫使我们的手.
我知道这是一个很长的答案,也许简短的说法是:虽然WTForms通常可以与大多数Web框架一起使用,但它的设计是根据您的用途进行配置和定制的.一切都不插即用.
前言,我是作者之一,目前是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(...)
或者像星球一样进口 from myapp.forms import *
您将注意到我还包括一个自定义表单子类,它设置CSRF并默认提供CSRF上下文,这不是绝对必要的.(顺便说一句,如果您使用的是烧瓶,Flask-WTF会为您设置类似的CSRF设置,但重点是说明如何轻松实现自己的集成.)
现在为什么.
WTForms的核心思想是提出一个非常简单,可靠的框架,适用于大多数用例,但是可扩展性足以让人们可以提供配套工具来处理特定的用例.
在早期,这样做的解决方案是将interop的扩展与各种库结合在一起.但这带来了一个问题,因为它极大地增加了测试的复杂性和表面区域,而且它会以奇怪的方式驱动WTForms版本(Django只是改变了这一点,现在你需要发布一个新的WTForms).所以在2015年,我们决定将所有扩展移动到他们自己的包中,以允许他们自己的发布时间表.
与其强迫人们使用一个试图完成所有事情的单一软件包,这已经形成了一个真正伟大的生态系统,其中包括Flask-WTF,WTForms-Alchemy和WTForms-Django等坚实的配套软件包.
至于HTML5类型没有记录的原因; 好吧,这是一个遗漏.还有一些历史:在某些时候,我们将默认的WTForms字段输出从XHTML样式切换为HTML紧凑语法; 但保留了核心领域的产出.因此,我们让人们回馈XHTML表单,人们贡献html5字段,以及希望默认字段使用HTML5类型的人,所有这些都在我们保证在主要版本中的向后兼容性之后,这迫使我们的手.
我知道这是一个很长的答案,也许简短的说法是:虽然WTForms通常可以与大多数Web框架一起使用,但它的设计是根据您的用途进行配置和定制的.一切都不插即用.