在 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,并且我的应用程序完全按预期工作。

好的,感谢您阅读所有背景资料。现在开始提问:

对于文本字段,我可以使用以下任何一种:

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 的主要维护者

在讨论为什么之前,我应该提一下使用 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-WTFWTForms-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 表单, 处理那个。