1

我正在尝试编写一个控制器方法和一个相应的视图,它将使用 Ajax 在 web2py 上调用控制器。这个想法是在数据库上做一个小的更新,并使用 Ajax 在目标 div 上返回一个简单的更新消息。下面是控制器方法:

def deleteajax():
recid1 = request.vars.recid
reptype1 = request.vars.reptype
if recid1 == None:
    out = 'Missing Param : recid'
    return out
if reptype1 == None:
    reptype1 = 'pr'        
if reptype1 == 'pr':
    row = db2(db2.prs_mailed.id==recid1).select().first()
    return str(row.id)
elif reptype1 == 'tb':
    row = db2(db2.tbs_mailed.id==recid1).select().first()
else:
    return 'Please provide the parameter : rep'
if row['action'] == 'D':
    out = 'Already deleted'
    return out
else:
    row.update_record(action='D')
    out = 'Deleted Successfully!'
    return out

这就是我从视图中调用相同的方式:

     <form>{{
     response.write('<input type="hidden" name="recid" value="'+str(response._vars['prs']['id'][k])+'"/>',escape=False)}}
     <input type ='button' name="del" value = "D"  onclick="ajax('deleteajax', ['reid'], 'target')" />
     <div id="target"></div>
     </form>

我已经使用 POST 调用单独测试了控制器,并且可以正常工作。甚至 AJAX 调用也能正常工作,并在目标 div 上显示错误消息,例如“Missing Param:recid”。我什至尝试在完成每个语句后修改控制器以显示更多消息。但是,发布任何数据库操作后,不会执行来自控制器的命令,也不会在目标 div 上显示任何内容。我哪里错了?

4

1 回答 1

1

首先,而不是这个:

{{response.write('<input type="hidden" name="recid" value="' +
    str(response._vars['prs']['id'][k])+'"/>',escape=False)}}

只需这样做:

<input type="hidden" name="recid" value="{{=prs['id'][k])}}"/>

无需使用 response.write 或通过 response._vars 访问“prs”对象(response._vars 中的所有项目在视图环境中全局可用)。

关于 Ajax 问题,您的输入元素名称是“recid”,但您的ajax()调用指的是“reid”。将后者更改为“recid”,看看它是否有效。

更新:

要创建多个唯一的 recid,您可以执行以下操作:

name="{{='recid%s' % prs['id'][k]}}"

然后,在控制器中,检查以“recid”开头的 request.vars:

recid = [v for v in request.post_vars if v.startswith('recid')]
if recid:
    recid = int(recid[0][5:])
    [code to delete record with id==recid]
于 2012-06-21T15:26:45.320 回答