web2py 如何:Ajax 将下拉菜单的值发送到操作

web2py how to: Ajax to send dropdown menu's value to action

我有一个可用的下拉菜单,我可以使用 "submit" 按钮将其值发送到一个函数。然而,它非常笨拙,因为用户总是必须按下按钮,等待页面加载并刷新页面,因此用户会丢失页面上的所有其他 "settings"。我知道 ajax 是解决这个问题的方法。我阅读了指南:http://www.web2py.com/books/default/chapter/29/11/jquery-and-ajax#The-ajax-function 并尝试了一些方法,但始终无效。

所以这是我原来的工作代码。一些内容被剥离和更改,但基本内容是相同的。查看 demo.html:

<form action="change_dropdown">
    <select name="tables">
            <option value="first_value">first</option>
            <option value="second_value">second</option>
            <option value="third_value">third</option>
    </select>
    <br><br>
    <input type="submit">
</form>

操作:

def change_dropdown():
    if request.vars.tables:
        session.tables = request.vars.tables
    else:
        session.tables = None
        session.main_warning= "Incorrect parameters for function: 'change_dropdown()'."
    redirect(URL('demo'))
    return

然后原来的动作demosession.tables做了一些事情等等。但现在要将其变为 ajax。这就是我想要的:

<form>
    <select name="tables", onchange="ajax('change_dropdown', [], '');">
            <option value="first_value">first</option>
            <option value="second_value">second</option>
            <option value="third_value">third</option>
    </select>
</form>

我也对动作执行了此操作:redirect(URL('demo'), client_side=True) 如示例中所述。但是我不知道为什么需要它。

但我不知道如何将变量 tables 发送到操作。如果我将它写在 python URL 帮助程序中,它会崩溃,因为它认为它是一个 python 变量(实际上它是一个 JavaScript 变量(?))。如果我将它写在 ajax() 函数的第二个参数中,它会停止并在 JS 控制台中给我一个奇怪的错误:

Uncaught Error: Syntax error, unrecognized expression: [name=[object HTMLSelectElement]]

如果您需要更多信息,我可以向您展示我尝试过的方法的完整代码,但我认为有人可以从这里获取它。

您可以按如下方式发送变量:

ajax("{{=URL('change_dropdown')}}",['tables'],':eval') 

redirect(URL('demo'), client_side=True) 是必需的,因为您要重定向已发送 ajax 请求的函数,而不是 'change_dropdown' 重定向。

编辑:

<form>
    <select name="tables", onchange="ajax(\"{{=URL('change_dropdown')}}\",['tables'],':eval') ;">
        <option value="first_value">first</option>
        <option value="second_value">second</option>
        <option value="third_value">third</option>
    </select>
</form>