2015-10-29 98 views
0

我是新來的Python,我試圖使用web2py製作一個簡單的公告板系統應用程序。我正在試圖在某個董事會中添加帖子,並通過在帖子表中添加以下字段來鏈接帖子和董事會:字段('board_id',db.board)。當我嘗試在特定的電路板內創建一個帖子時,它給了我一個錯誤:「OperationalError:沒有這樣的列:board.id」。我對create_posts代碼:python數據庫錶鏈接

def add_post(): 
     board = db.board(request.args(0)) 
     form = SQLFORM(db.post) 
     db.pst.board_id.default = db.board.id 
     if form.process().accepted: 
      session.flash = T('The data was inserted') 
      redirect(URL('default', 'index')) 
     return dict(form=form, board=board) 

當我嘗試做{{=板}},顯示在一定的板職位的頁面上,我得到行{「名」:「你好」,「ID」 :1L,'pst':Set(pst.board_id = 1),'description':'hi'}所以我知道它在數據庫中。但是當我爲「添加帖子」表單頁面做同樣的事情時,它會顯示「board:None」。我非常困惑,請指向正確的方向!

+0

'db.board(request.args中(0))''從其db.board'返回記錄'id'等於'request.args中(0) )'或'無',如果沒有該'id'的記錄。所以,對於'request.args(0)'沒有值,或者它的值與你的任何記錄ID都不匹配。據推測,您正在生成鏈接到「add_post」,其中包含一個記錄ID作爲第一個URL arg。你如何生成這些鏈接? – Anthony

回答

0

你的功能似乎有幾個問題。首先,將board_id字段的默認值指定爲Field對象(即db.board.id)而不是實際的id值(例如,board.id)。其次,在創建SQLFORM之前,應將任何默認值分配爲

最後,你傳遞給db.postSQLFORM,但在下一行,後表出現被稱爲db.pst - 想必這些都不是兩個獨立的表和一個僅僅是一個錯字。

關於{{=board}}顯示None的問題,這表明board = db.board(request.args(0))未檢索記錄,這是由於request.args(0)本身是None或與之不匹配db.board任何記錄id的值。您應該檢查如何生成導致add_post的鏈接,並確認第一個URL arg中存在有效的db.board id。在任何情況下,檢測何時沒有有效的板記錄並重定向或顯示錯誤消息可能是一個好主意。

所以,你的函數應該是這個樣子:

def add_post(): 
    board = db.board(request.args(0)) or redirect(URL('default', 'index')) 
    db.pst.board_id.default = board.id 
    form = SQLFORM(db.pst) 
    if form.process(next=URL('default', 'index'), 
        message_onsuccess=T('The data was inserted')) 
    return dict(form=form, board=board) 

請注意,如果你有信心,鏈接add_post將包括有效板的ID,那麼你就可以完全消除第一行,因爲沒有如果您唯一需要的字段是ID(您已擁有),則根據其ID來檢索記錄的理由。取而代之的是,第二行可以是:

db.pst.board_id.default = request.args(0) or redirect(URL('default', 'index')) 
+0

非常感謝你!當我用它替換前兩行時,這行代碼有效:db.pst.board_id.default = request.args(0)或重定向(URL('default','index')) – user3883570