【问题标题】:Using HTML5 fields with WTForms在 WTForms 中使用 HTML5 字段
【发布时间】:2016-04-14 20:12:38
【问题描述】:

我正在使用 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]文件中添加一行,我不愿意这样做,因为这是一个教育项目,这只会让学习者感到困惑。

我在找

  • 了解为什么 WTForms 不记录或默认导入 html5 字段
  • 继续使用 wtforms-html5 第三方模块的任何理由。

【问题讨论】:

    标签: python html flask wtforms flask-wtforms


    【解决方案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-WTF 会为您设置类似的 CSRF,如果您使用的是烧瓶,但重点是说明如何轻松实现自己的集成。)


    现在是为什么。

    WTForms 的核心理念是提出一个非常简单、可靠的框架,该框架适用于大多数用例,但具有足够的可扩展性,人们可以提供配套工具来处理特定用例。

    在早期,解决方案是将extensions 与各种库进行互操作。但这带来了一个问题,因为它极大地增加了测试的复杂性和表面积,而且它会以奇怪的方式推动 WTForms 的发布(Django 刚刚改变了这件事,现在你需要发布一个新的 WTForms)。所以在 2015 年,我们决定将所有扩展移到他们自己的包中,以便他们有自己的发布时间表。

    与其强迫人们使用试图做所有事情的单一软件包,这导致了一个非常棒的生态系统出现,其中出现了可靠的配套软件包,例如 Flask-WTFWTForms-AlchemyWTForms-Django 等等。

    关于为什么没有记录 HTML5 类型;好吧,这是一个遗漏。另外,一些历史:在某些时候,我们将默认的 WTForms 字段输出从 XHTML 样式切换到 HTML 紧凑语法;但保留了核心字段输出。因此,我们让人们回馈 XHTML 表单、贡献 html5 字段,以及希望默认字段使用 HTML5 类型的人,所有这些都是在我们保证在主要版本中向后兼容之后,这让我们有点吃力。


    我知道这是一个很长的答案,也许简短的说法是:虽然 WTForms 通常可以与大多数开箱即用的 Web 框架一起使用,但它旨在根据您的用途进行配置和定制;不是即插即用。

    【讨论】:

    • 感谢您提供非常有帮助且详细的回复。文档也在github上吗?我很乐意快速写一篇文章,并在“字段”部分添加一个小节,其中提到 HTML5 字段可用,以及如何访问它们——如果您和其他维护者的资源太少而无法做所以。我认为目前很多人可能正在按照我采取的路线安装(或编写)第三方 pip 包以重新添加这些字段。
    【解决方案2】:

    WTForms HTML5 的作者在这里。简单介绍一下这个项目:从某种意义上说,它“没有维护”,它对我有用,我不需要添加任何东西。自从 vanilla WTForms 开始支持所有我建议使用普通 WTForms 的东西。

    如果您想要一些自动生成的小部件呈现关键字,当前的WTForms HTML5 版本删除了所有字段和小部件,现在 WTForms 也支持这些字段和小部件,而是使用处理该问题的表单 Meta 类。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 2021-07-20
      • 2014-07-28
      • 1970-01-01
      • 2021-08-07
      • 2011-05-02
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多