在web2py表单验证期间出了什么问题?

时间:2012-07-02 14:27:08

标签: forms web2py

我有一个相当简单的web2py表单,在其字段上有一些验证器,如IS_FLOAT_IN_RANGE(...)。当我尝试提交表单时,如果表单中包含未通过验证的字段,则表单将无法通过第一次验证,但不会报告存在任何错误。如果我然后重新提交相同的表单,验证将再次失败。

更糟糕的是,如果我提交有效信息,除非我两次提交相同的表格,否则不会提交。视图只是{{=form}}

控制器如下所示:

@auth.requires_login()
def addpipelines():
    form = FORM(INPUT(_name="type", _value="insert", _type="hidden"),
            INPUT(_name="project", _value="Project", requires=IS_NOT_EMPTY()),
            INPUT(_name="value", _value="Value", requires=IS_FLOAT_IN_RANGE(-1e100, 1e100)),
            BR(), BR(),
            INPUT(_type="submit", _value="Add"),
           _method="POST")

    if request.post_vars.type == "insert" and form.process().accepted:
       request.post_vars["blub"] = "blargh"

    return dict(form=form)

```

1 个答案:

答案 0 :(得分:3)

if request.post_vars.type == "insert" and form.process().accepted:

注意,在Python中,当and之前的部分为false时,and之后的上述表达式的部分将不会被评估,因此form.process()只会在表格已提交。但是,为了使表单处理正常工作,首次创建表单时也必须调用form.process()(因为它添加了一个隐藏的_formkey字段,并使用放置在会话中的formkey副本检查其值以保护反对CSRF攻击和双重提交)。相反,尝试切换条件的顺序:

if form.process().accepted and request.post_vars.type == "insert":