2012-07-02 53 views
0

我有一個相當簡單的web2py表單,它的字段上有一些驗證器,如IS_FLOAT_IN_RANGE(...)。當我嘗試提交表單時,如果它的字段沒有通過驗證,表單將失敗第一次驗證,但不會報告有任何錯誤。如果我再重新提交相同的表單,驗證將再次失敗。更糟糕的是,如果我提交有效信息,除非我提交兩次相同的表單,否則不會提交。該視圖是簡單地{{=form}}在web2py表單驗證期間出了什麼問題?

控制器看起來像這樣:

@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) 

```

回答

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

注意,在Python,上述表達式的and之後的部分將不會被評價當and之前的部分爲false時,僅在提交表單時纔會調用form.process()。然而,要使表單處理正常工作,form.process()也必須在表單首次創建時調用(因爲它會添加一個隱藏的_formkey字段並使用放置在會話中的formkey副本檢查其值,以防止CSRF攻擊並且雙提交)。相反,請嘗試切換條件的順序:

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