2012-11-21 22 views
1

我正在關注Web2py的關於SQLFORM的HTML書籍。 http://web2py.com/books/default/chapter/29/07#SQLFORMHTML2中的Web2py SQLFORM

但是,我似乎無法弄清楚。我已將隱藏字段name="_formname"及其值設置爲test。該表格似乎沒有被處理。這裏是我的代碼:

的test.html:

<form action="" method="post"> 
    <ul> 
     <li>Your name is <input name="name" /></li> 
    </ul> 
    <input type="submit" /> 
    <input type="hidden" name="_formname" value="test" /> 
</form> 

控制器/默認/ test.py:

def test(): 
form = SQLFORM(db.person) 
if form.process(formname='test').accepted: 
    session.flash = T('Succeeded.') 
    redirect(URL('index')) 
elif form.errors: 
    response.flash=T('Form has errors.') 
return dict() 

模型/ db.py:

db.define_table('person', 
Field('name', requires=IS_NOT_EMPTY())) 
+1

什麼是你的test.html文件(圖) – chespinoza

回答

2

公告書例子包括以下內容:

form.process(session=None, formname='test') 

在上述中,設置session=None禁用隱藏「_formkey」字段,其用於保護agains t CSRF攻擊和雙表單提交。但是,在您的代碼中,您沒有設置session=None,這意味着表單在提交時處理時,會期望收到隱藏的「_formkey」值。如果未找到該值,則處理失敗,但不會生成任何form.errors,因此您的錯誤條件將不會被觸發。要準確複製書中的示例,您必須設置session=None。否則,如果您想保留CSRF保護(這是一個好主意),你可以添加以下到HTML表單:

<input name="_formkey" type="hidden" value="{{=formkey}}" /> 

您還必須修改控制器函數返回的formkey值在視圖中使用:

def test(): 
    ... 
    return dict(formkey=form.formkey) 
+0

我得到一個錯誤,說在SQLFORM中沒有屬性formkey。 –

+0

嘗試了會話=無,它工作。謝謝 ! –

+0

只有在調用'.process()'方法之後'formkey'屬性纔會存在,並且只有在不設置'session = None'的情況下。 – Anthony

1

您需要將HTML代碼放在名爲test.html的視圖上

和代碼:

session.flash = T('Succeeded.') 

將其更改爲:

response.flash='Succeeded.' 

T()尋找一個定義的字符串翻譯,我沒有看到一個叫做成功的字符串。在語言文件上。只有你的視圖文件

嘗試:

{{=form}} 

在這樣web2py會自動爲您生成表單,不需要代碼的形式手動

+2

注意代碼,它是確定設置'session.flash = T',即使不存在(「成功」。) 「成功」。輸入語言文件。任何不在語言文件中的字符串都會自動添加,然後您可以進入並添加翻譯(如果您不添加翻譯,字符串將僅顯示未翻譯 - 您不會收到錯誤)。 – Anthony

+0

是的,我確實把我的HTML代碼放在視圖文件夾中的一個單獨的文件中。我只是沒有在這裏說明。 –