【问题标题】:JavaScript/Ajax to Dynamically Update WTForms Select FieldJavaScript/Ajax 动态更新 WTForms 选择字段
【发布时间】:2016-01-05 18:39:31
【问题描述】:

好的。我知道这已经解决了很多次,但我找不到一个有用的 javascript 示例的答案。

假设我有这个表格:

class MyForm(Form):
    category = SelectField("Category")
    issue = SelectField("Issue")

我需要的是在运行时在“类别”中选择的任何内容,以确定用户在问题下拉列表中看到的内容,而不会出现任何类型的 POST。我知道如何从我的数据库查询中动态创建视图中的选项。我什至甚至根据类别选择创建了一个“问题选择”字典。

我一生都无法弄清楚我需要的javascript,以便从类别下拉列表中选择某些内容来确定问题下拉列表中的内容。

【问题讨论】:

  • 实际上我很惊讶有这么少的例子 - 我认为它会更常见

标签: javascript python flask wtforms


【解决方案1】:

我通过查看Flask jQuery AJAX Example 的示例找到了我需要的信息 - - 这是一个最小的工作示例,几乎是 GIST 或书籍章节。

【讨论】:

  • 对于后代,您能否在您的答案中包含您认为有用的链接的相关部分?这样,如果链接断开、更改等,您的答案不会变得无用。非常感谢。
  • 不幸的是,由于 Web 项目的当前性质,即使是最小的示例也包含多个文件(javascript + 模板 + 视图 + 模型 + 应用程序引导程序) - 所以,在此处添加 then 会适得其反。跨度>
【解决方案2】:

我想出了一个非常接近 jsbueno 实现的示例。你可以在这里找到Gist。 .py 文件是一个独立的示例。

在您的 html 模板中,当您单击选择字段时,使用 jquery 注册一个 ajax 请求。如果请求成功,则选择字段的 html 将使用新的选择选项进行更新(作为来自服务器的响应发送)。查看模板生成的实际 HTML 以了解选择字段的外观。

<form action="" method="post" id="selectDevice" name="device">
    Nummber of Devices: {{ form.selectAmount(size=1) }}
    Select device: {{form.deviceAddress() }}
</form>
<script type="text/javascript" charset="utf-8">
$("#deviceAddress").click(function(){
    $.ajax({
        url: '/selectform',
        type: 'POST',
        data: $('#selectDevice').serialize(),
        success: function(selectOptions){
            $("#deviceAddress").empty();
            for (var i = 0; i < selectOptions.length; i++){
                $("#deviceAddress").append(
                    $("<option></option>")
                    .attr("value", selectOptions[i][0])
                    .text(selectOptions[i][1])
                );
            }
        }
    });
});
</script>

在服务器端,使用 ajax 发布请求的路由。`例如,此路由会根据另一个表单字段更改选项(通过 ajax 请求中的数据标签发送的信息)。在 WTForms 中,选择字段选项是一个包含 ID 和名称的元组列表,我在 python 端保持相同。

@app.route('/selectform', methods=['POST'])
def updateselect():
    deviceAmount = int(request.form.get('selectAmount'))
    choices = [('device{}'.format(i), i) for i in range(deviceAmount)]
    response = make_response(json.dumps(choices))
    response.content_type = 'application/jsons'
    return response`

只有一点:ajax请求是在下拉和折叠时执行的。最后一部分当然不是必需的,可能有一种方法可以构造 jquery,因此它只在下拉列表中请求。

【讨论】:

  • gist 的内容可能会发生变化,或者链接将来可能会停止工作。您应该在答案中发布相关代码。
猜你喜欢
  • 2015-10-15
  • 2016-07-30
  • 2012-12-07
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2020-10-04
  • 2020-05-02
相关资源
最近更新 更多