我正在学习http://code.tutsplus.com/tutorials/intro-to-flask-adding-a-contact-page--net-28982中的烧瓶教程,目前正在进行验证步骤:
旧版本有以下内容:
from flask.ext.wtf import Form, TextField, TextAreaField, SubmitField, validators, ValidationError
class ContactForm(Form):
name = TextField("Name", [validators.Required("Please enter your name.")])
email = TextField("Email", [validators.Required("Please enter your email address."), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")
阅读注释时,我将其更新为:(用InputRequired替换了验证器。必需)
(same fields)
class ContactForm(Form):
name = TextField("Name", validators=[InputRequired('Please enter your name.')])
email = EmailField("Email", validators=[InputRequired("Please enter your email address.")]), validators.Email("Please enter your email address.")])
submit = SubmitField("Send")
我唯一的问题是我不知道该怎么处理validators.Email。我得到的错误消息是:
NameError: name 'validators' is not defined
我看过文档,也许我没有深入研究,但似乎找不到电子邮件验证的示例。
此错误的原因是,您很可能使用
from foo import bar
import语句导入了不带命名空间的验证器。要使其更具可读性并修复示例代码中的语法错误,请执行以下操作:
这只在字段
TextField
、SubmitField
和Email
中加载,并且只在InputRequired
和Email
验证器中加载。然后简单地在validators
关键字参数中链接验证器,就可以了。或者,正如@Mehdi Sadeghi在代码中指出的,直接提供一个验证器列表作为字段的第二个参数,在这种情况下,您的电子邮件字段将如下所示:注意,通过使用语法
from foo import bar
只导入所需内容,您将丢弃模块名称空间,正如您在删除validators.
前缀时注意到的那样。有些人发现,最好离开这个名称空间,然后使用点表示法,这样做只是为了防止可能的名称冲突,并立即查看对象所属的模块(无需回顾import语句)。一如既往,选择权在你!
试试这个:
我复习了同样的教程(我已经好几年没看烧瓶了)。
问题是由于0.9版本的烧瓶WTF发生了变化。Here他们说:
要直接导入,forms.py应为:
注意
StringField
替换TextField
,并且InputRequired
is preferred overDataRequired
。直接导入验证器是个人偏好,而不是导入整个命名空间。这也适用于:from wtforms import *
和表单类:name = StringField("Name", [validators.InputRequired("message")
在更新到最新版本的Flask WTF时,也可以在视图中使用
validate_on_submit()
(as recommended here)。相关问题 更多 >
编程相关推荐