在 WTForms 中使用 HTML5 个字段
Using HTML5 fields with WTForms
我正在使用 Flask 开发 Web 应用程序。我最初是手动制作 HTML 表格,然后切换到使用 WTForms(这是一个教育项目,所以我展示了构建项目的每个步骤)。
我在尝试添加 HTML5 个表单字段(例如 EmailField)时感到有点困惑。我搜索了 WTForms 文档和在线文档,但找不到如何使用 HTML5 EmailField 创建 WTForm。
然后我安装了这个模块https://pypi.python.org/pypi/wtforms-html5 which allowed for it, and everything worked. But I was unhappy about adding an extra dependency, especially as it doesn't seem to be actively developed (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]
文件中添加一行,我不愿意这样做,因为这是一个教育项目,这只会让学习者感到困惑。
我在找
- 深入了解为什么 WTForms 不记录或默认导入 html5 字段
- 继续使用 wtforms-html5 第三方模块的任何理由。
前言,我是作者之一,目前是 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,Flask-WTF 会为您进行类似的 CSRF 设置,但重点是说明如何轻松实现您自己的集成。)
现在是为什么。
WTForms 的核心思想是提出一个非常简单、可靠的框架,该框架适用于大多数用例,但具有足够的可扩展性,人们可以提供配套工具来处理特定用例。
早期,解决方案是将 extensions 与各种库进行互操作。但这带来了一个问题,因为它大大增加了测试的复杂性和表面积,而且它会以奇怪的方式驱动 WTForms 发布(Django 刚刚改变了这个东西,现在你需要发布一个新的 WTForms)。因此在 2015 年,我们决定将所有扩展移至它们自己的包中,以允许它们拥有自己的发布时间表。
与其强迫人们使用试图做所有事情的单一包,不如这导致了一个真正伟大的生态系统出现,并出现了可靠的配套包,如 Flask-WTF、WTForms-Alchemy 和 WTForms-Django 等等。
至于为什么没有记录 HTML5 类型;好吧,这是一个遗漏。此外,还有一些历史:在某些时候,我们将默认的 WTForms 字段输出从 XHTML-style 切换为 HTML 紧凑语法;但保留了核心实地产出。因此,我们让人们回馈 XHTML 表单,人们贡献 html5 字段,以及希望默认字段使用 HTML5 类型的人们,所有这些都是在我们保证在主要版本中向后兼容之后,这有点用力了。
我知道这是一个很长的答案,也许简短的说法是:虽然 WTForms 通常可以与大多数开箱即用的 Web 框架一起使用,但它的设计目的是根据您的用途进行配置和定制;并非即插即用。
WTForms HTML5 的作者在这里。快速了解一下该项目:从某种意义上说,它 "wasn't maintained" 对我有用,我无需添加任何内容。由于 vanilla WTForms 开始支持所有我推荐使用普通 WTForms 的东西。
如果您想要为您的小部件自动生成渲染关键字,当前 WTForms HTML5 版本删除了所有字段和小部件,现在 WTForms 也支持这些字段和小部件,而是使用 Meta class 表单, 处理那个。
我正在使用 Flask 开发 Web 应用程序。我最初是手动制作 HTML 表格,然后切换到使用 WTForms(这是一个教育项目,所以我展示了构建项目的每个步骤)。
我在尝试添加 HTML5 个表单字段(例如 EmailField)时感到有点困惑。我搜索了 WTForms 文档和在线文档,但找不到如何使用 HTML5 EmailField 创建 WTForm。
然后我安装了这个模块https://pypi.python.org/pypi/wtforms-html5 which allowed for it, and everything worked. But I was unhappy about adding an extra dependency, especially as it doesn't seem to be actively developed (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]
文件中添加一行,我不愿意这样做,因为这是一个教育项目,这只会让学习者感到困惑。
我在找
- 深入了解为什么 WTForms 不记录或默认导入 html5 字段
- 继续使用 wtforms-html5 第三方模块的任何理由。
前言,我是作者之一,目前是 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,Flask-WTF 会为您进行类似的 CSRF 设置,但重点是说明如何轻松实现您自己的集成。)
现在是为什么。
WTForms 的核心思想是提出一个非常简单、可靠的框架,该框架适用于大多数用例,但具有足够的可扩展性,人们可以提供配套工具来处理特定用例。
早期,解决方案是将 extensions 与各种库进行互操作。但这带来了一个问题,因为它大大增加了测试的复杂性和表面积,而且它会以奇怪的方式驱动 WTForms 发布(Django 刚刚改变了这个东西,现在你需要发布一个新的 WTForms)。因此在 2015 年,我们决定将所有扩展移至它们自己的包中,以允许它们拥有自己的发布时间表。
与其强迫人们使用试图做所有事情的单一包,不如这导致了一个真正伟大的生态系统出现,并出现了可靠的配套包,如 Flask-WTF、WTForms-Alchemy 和 WTForms-Django 等等。
至于为什么没有记录 HTML5 类型;好吧,这是一个遗漏。此外,还有一些历史:在某些时候,我们将默认的 WTForms 字段输出从 XHTML-style 切换为 HTML 紧凑语法;但保留了核心实地产出。因此,我们让人们回馈 XHTML 表单,人们贡献 html5 字段,以及希望默认字段使用 HTML5 类型的人们,所有这些都是在我们保证在主要版本中向后兼容之后,这有点用力了。
我知道这是一个很长的答案,也许简短的说法是:虽然 WTForms 通常可以与大多数开箱即用的 Web 框架一起使用,但它的设计目的是根据您的用途进行配置和定制;并非即插即用。
WTForms HTML5 的作者在这里。快速了解一下该项目:从某种意义上说,它 "wasn't maintained" 对我有用,我无需添加任何内容。由于 vanilla WTForms 开始支持所有我推荐使用普通 WTForms 的东西。
如果您想要为您的小部件自动生成渲染关键字,当前 WTForms HTML5 版本删除了所有字段和小部件,现在 WTForms 也支持这些字段和小部件,而是使用 Meta class 表单, 处理那个。