在WTForms

时间:2016-01-10 13:30:29

标签: python html5 flask wtforms flask-wtforms

我正在使用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第三方模块的任何理由。

2 个答案:

答案 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-WTFWTForms-AlchemyWTForms-Django这样的实体伴随包创建了一个非常棒的生态系统。仅举几例。

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

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

答案 1 :(得分:1)

WTForms HTML5的作者。只是快速了解项目:从某种意义上来说,“没有被维护”,它对我有用,我没有必要添加任何东西。由于vanilla WTForms开始支持所有这些东西,我建议使用简单的WTForms。

如果你想为你的小部件生成一些自动生成的渲染关键字,那么当前的WTForms HTML5版本会删除所有的字段和小部件,现在WTForms也支持这些字段和小部件,而是使用Meta类处理表单。 / p>