WTForms 不验证 - 无错误

7 投票
2 回答
4727 浏览
提问于 2025-04-16 09:03

我遇到了一个关于WTForms库的奇怪问题。为了测试,我创建了一个只有一个字段的表单:

class ArticleForm(Form):
    content = TextField('Content')

这个字段接收一个简单的字符串作为内容,现在我使用form.validate(),但是它总是返回False,我不知道为什么。

我查看了'Form''Field'对象的validate()方法。我发现,如果错误列表的长度为零,字段就会返回真。我的测试中确实没有任何错误,所以这个条件是成立的。在命令行中,我的字段验证返回的结果也是正确的。

表单对象中的validate()方法只是遍历所有字段,并调用它们的validate()方法,只有当其中一个字段验证为假时,才会返回假。

所以因为我的字段没有任何错误被验证,我在代码中找不到任何原因导致form.validate()返回False

有没有什么想法?

2 个回答

0

你传给表单构造函数的是什么?你没有提供关于这个表单是怎么用的背景信息。

表单的第一个参数必须是一个表单数据的输入包装器。有效的选项包括但不限于:

  • Django(request.POSTrequest.GET
  • Werkzeug(request.formrequest.args
  • WebOb(视情况而定,包括Pylon/Pyramid、TurboGears和Google App Engine的webapp框架)
  • cgi.FieldStorage或类似的东西

在类似Django的视图中使用的方式如下:

def view(request, article_id):
    article = Article.objects.get(article_id)
    form = ArticleForm(request.POST, obj=article)
    if request.POST and form.validate():
        # do something
    # render stuff, etc
7

看起来你传给表单的值不对。这是你需要使用这个表单的方式:

from wtforms import Form, TextField # This is wtforms 0.6

class DummyPostData(dict):
    """
    The form wants the getlist method - no problem.
    """
    def getlist(self, key):
        v = self[key]
        if not isinstance(v, (list, tuple)):
            v = [v]
        return v

class ArticleForm(Form):
    content = TextField('Content')

form = ArticleForm(DummyPostData({'content' : 'my content' }))
print form.validate()
#$ python ./wtf.py 
#True

另外,如果你能提供更详细的信息,比如代码示例和WTForms的版本,那就更好了。

撰写回答