我正在使用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导入字段的最佳做法是什么?
对于文本字段,我可以使用以下任何一种方法:
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
但这需要在字段[__init__][1]
文件中添加一行,我不愿意这样做,因为这是一个教育项目,这只会让学习者感到困惑。
我正在寻找
答案 0 :(得分:7)
前言,我是其中一位作者,目前是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'核心思想是提出一个非常简单,可靠的框架,适用于大多数用例,但是可扩展性足以让人们可以提供配套工具来处理特定用例。
早期,这样做的解决方案是将extensions与各种库结合使用。但这带来了一个问题,因为它极大地增加了测试的复杂性和表面区域,而且它会以奇怪的方式驱动WTForms版本(Django只是改变了这一点,现在你需要发布一个新的WTForms)。所以在2015年,我们决定将所有扩展移动到他们自己的包中,以允许他们自己的发布时间表。
不是强迫人们使用单个试图完成所有事情的包,而是通过Flask-WTF,WTForms-Alchemy和WTForms-Django这样的实体伴随包创建了一个非常棒的生态系统。仅举几例。
至于为什么HTML5类型没有记录;好吧,这是一个遗漏。还有一些历史:在某些时候,我们将默认的WTForms字段输出从XHTML样式切换为HTML紧凑语法;但保留了核心领域的产出。那么我们让人们回馈XHTML表单,人们贡献html5字段,以及希望默认字段使用HTML5类型的人,所有这些都在我们保证在主要版本中向后兼容之后,这迫使我们的手。
我知道这是一个很长的答案,也许简短的说法是:虽然WTForms通常可以与大多数Web框架一起使用,但它可以根据您的用途进行配置和定制;没有即插即用。
答案 1 :(得分:1)
WTForms HTML5的作者。只是快速了解项目:从某种意义上来说,“没有被维护”,它对我有用,我没有必要添加任何东西。由于vanilla WTForms开始支持所有这些东西,我建议使用简单的WTForms。
如果你想为你的小部件生成一些自动生成的渲染关键字,那么当前的WTForms HTML5版本会删除所有的字段和小部件,现在WTForms也支持这些字段和小部件,而是使用Meta类处理表单。 / p>