【问题标题】:web2py ajax issue onclickweb2py ajax 问题 onclick
【发布时间】:2012-06-23 08:27:05
【问题描述】:

我正在尝试编写一个控制器方法和一个相应的视图,它将使用 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 上显示任何内容。我哪里错了?

【问题讨论】:

    标签: python html ajax web2py


    【解决方案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]
    

    【讨论】:

    • 感谢您的回复。我已经删除了 response.write 部分并按照您提到的提高可读性进行了更改。 reid 是故意的,因此它至少会从控制器中打印出缺少参数的错误消息,它确实做到了。
    • 我最终推断出这种行为的原因是因为我在 html 文件中有许多其他名为 recid 的输入,并且在将其传递给控制器​​时,它会传递所有这些值的列表。我正在为项目列表打印此视图部分,每个项目都具有具有相同输入控件名称的此表单。您能帮我解决一下如何使这个独一无二并从控制器中引用相同的内容吗? web2py上同一个按钮的点击事件是否可以结合ajax和javascript?
    • 也许只是给每个输入一个唯一的名称:name="{{='recid%s' % prs['id'][k]}}"。在控制器中,您只需检查以“recid”开头的 response.vars。
    • 非常感谢.. 试试吧!
    • 你能指导我如何检查所有以recid开头的response.vars吗?我尝试在控制器上使用 request.args[0] 之类的东西,但它们无法正常工作。有没有一种方法可以列出所有请求变量?对于这些简单的问题,我很抱歉,我是 web2py 的初学者,无法从谷歌获得这些问题的答案。
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2014-01-17
    • 2016-01-09
    相关资源
    最近更新 更多