我是Python的新手,我正在尝试使用web2py创建一个简单的公告板系统应用程序。我正在尝试将帖子添加到某个棋盘中,并通过在我的帖子表中包含以下字段来链接帖子和棋盘:Field('board_id',db.board)。当我尝试在特定板内创建一个帖子时,它会给我一个错误:“OperationalError:no such column:board.id”。我的create_posts代码:
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)
当我尝试在显示某个主板上的帖子的页面上执行{{= board}}时,我得到Row {'name':'hi','id':1L,'pst':Set( pst.board_id = 1),'description':'hi'}所以我知道它在数据库中。但是,当我为“添加帖子”表单页面执行相同操作时,它会显示“board:None”。我非常困惑,请指出我正确的方向!
答案 0 :(得分:0)
您的功能似乎存在一些问题。首先,您要将board_id
字段的默认值指定为Field
对象(即db.board.id
),而不是实际的ID值(例如board.id
)。其次,在创建SQLFORM
之前,应该为分配任何默认值。
最后,您将db.post
传递给SQLFORM
,但在下一行中,帖子表似乎被称为db.pst
- 可能这些不是两个单独的表,一个只是一个错字。
关于显示{{=board}}
的{{1}}问题,表明None
未检索到记录,而board = db.board(request.args(0))
本身就是request.args(0)
或者是与None
中任何记录ID不匹配的值。您应该检查如何生成指向db.board
的链接,并确认第一个网址arg中存在有效的add_post
ID。在任何情况下,检测何时没有有效的电路板记录并重定向或显示错误消息可能是个好主意。
所以,你的函数应该是这样的:
db.board
注意,如果您确信指向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)
的链接将包含有效的主板ID,那么您可以完全取消第一行,因为没有理由根据其ID来检索记录需要它是ID(你已经拥有)。相反,第二行可能是:
add_post