当前位置: 首页 > 面试题库 >

Flask中的jQuery自动完成

王棋
2023-03-14
问题内容

无法使jQuery自动完成小部件与Flask框架一起使用。(http://jqueryui.com/autocomplete/#remote这里是一个示例)
在manage.py中,我得到了以下内容:

@app.route('/autocomplete', methods=['GET'])
def autocomplete():
    results = []
    search = request.args.get('autocomplete')
    for mv in db_session.query(Movie.title).filter(Movie.title.like('%' + str(search) + '%')).all():
        results.append(mv[0])
    return jsonify(json_list=results) 

我的index.html文件:

    <head>
    ...
    <link href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
    <script src="../static/js/jquery.js"></script>
    <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>


    <script type="text/javascript">
    $(function() {
        $.ajax({
            url: '{{ url_for("autocomplete") }}'
            }).done(function (data) {
                $('#autocomplete').autocomplete({
                    source: data.json_list,
                    minLength: 2
                });
            });
        });
    </script>
    ...
    </head>
    <body>
    ...
       <div>
          <input name="autocomplete" type="text" id="autocomplete" class="form-control input-lg"/>
       </div>
    ...
    </body>

似乎firefox中的开发工具不会返回任何错误。终端返回以下内容:

“ GET / autocomplete HTTP / 1.1” 200- “ GET /HTTP/1.1 ” 200- “ GET /static/css/bootstrap.css HTTP / 1.1” 304-“ GET /static/js/jquery.js HTTP / 1.1” 304 --

小部件不起作用。由于我对jQuery知之甚少,所以我不知道是什么原因导致了问题。有人可以帮我吗?


问题答案:

以下是有效的JS / jQuery和Flask代码:

@app.route('/autocomplete', methods=['GET'])
def autocomplete():
    search = request.args.get('q')
    query = db_session.query(Movie.title).filter(Movie.title.like('%' + str(search) + '%'))
    results = [mv[0] for mv in query.all()]
    return jsonify(matching_results=results)

HTML / jQuery:

<head>
<link href="//code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" rel="Stylesheet"></link>
<script src="//code.jquery.com/jquery-2.2.0.min.js"></script>
<script src="//code.jquery.com/ui/1.10.2/jquery-ui.js" ></script>

<script type="text/javascript">
$(function() {
    $("#autocomplete").autocomplete({
        source:function(request, response) {
            $.getJSON("{{url_for('autocomplete')}}",{
                q: request.term, // in flask, "q" will be the argument to look for using request.args
            }, function(data) {
                response(data.matching_results); // matching_results from jsonify
            });
        },
        minLength: 2,
        select: function(event, ui) {
            console.log(ui.item.value); // not in your question, but might help later
        }
    });
})

</script>
</head>
<body>
    <div>
        <input name="autocomplete" type="text" id="autocomplete" class="form-control input-lg"/>
    </div>
</body>

依次进行一些解释:’q’是你的搜索项参数名称,如jQuery的$ .getJSON ajax调用中所定义。这已传递给flask,并使用拾取request.args.get。据此构造数据库查询,并使用列表推导构造结果。注意,使用列表推导,你不会初始化列表,也不会使用for + append组合;一条优雅的线可以处理一切。

接下来,jsonify返回results包装为字典的列表,其中包含matching_results保存结果列表的键。不要试图将json.dumps列表返回给你的ajax调用。见这里为什么(TL / DR:安全问题)。

还要注意,我故意更改了一些变量名,以便你可以告诉哪个脚本/烧瓶函数“看到”了哪个变量。例如,ajax调用看不到列表results,而是看到了matching_results。那就是里面(现在是javascript的)data对象

要获取列表matching_results是关键,请使用随附脚本中的模式。它比简单地发送列表更麻烦,但是更安全,最终将允许你使用JS / jquery在客户端执行更复杂的操作。

最后,该select选项将用户的选择打印到开发者控制台,仅供参考,这样你就可以实际响应用户的选择。



 类似资料:
  • 无法使jQuery自动完成小部件与Flask框架一起工作。(http://jqueryui.com/autocomplete/#remote下面是一个示例) 在管理中。py我得到了以下信息: 这是我的索引。html文件: 看起来 firefox 中的开发工具不会返回任何错误。终端返回以下内容: "GET /autocompleteHTTP/1.1"200- "GET/HTTP/1.1"200- "

  • 问题内容: 任何人都可以给我完整的步骤来使用jquery-ui自动完成功能。我正在使用grails 2.0.1。 我需要一个完整的示例,包括控制器和视图的代码。 提前致谢。 问题答案: 首先,您需要将main.gsp(在头部)添加到行中 插件将自动下载。 对于完整的示例,您可以使用此链接 http://jay-chandran.blogspot.com/2011/09/using-grails-w

  • 问题内容: 嗨,有人可以看一看,让我知道我要去哪里了。我正在尝试使jQuery UI自动完成工作。这是我的代码:这是search.php 这是我的JavaScript内联脚本 这是“汽车”股利 当我使用Firebug查看呼叫时,我看到search.php返回了 jQuery只是显示未定义的任何想法? 问题答案: 看看jquery ui自动完成文档 。您返回的JSON与自动完成功能所寻找的不匹配。您

  • 问题内容: 我在页面上使用AjgularJS,并想添加一个字段以使用来自jqueryui的自动完成功能,并且自动完成功能不会触发ajax调用。 我已经在没有angular的页面上测试了脚本(ng-app和ng- controller),并且效果很好,但是当我将脚本放在带有angularjs的页面上时,它停止工作。 任何想法? jQuery脚本: 有趣的提示:当我在Chrome检查器上调用脚本时,自

  • 我正在使用Laravel。自动完成速度很慢。我知道这可能是因为我的数据库有很多信息。我在表中总共有38432行。但是我确信脸书、推特等比我拥有更多。 如何加快自动完成的速度? 这是我的代码: JavaScript:

  • 问题内容: 在jQuery UI 1.8.4之前,我可以在为使用自动完成功能而构建的JSON数组中使用HTML。 我能够做类似的事情: 那会在下拉菜单中显示为红色文本。 从1.8.4开始,这不起作用。我找到了,该页面告诉我在这里使用自定义HTML示例,但我并不幸运。 如何使HTML显示在建议中? 我的jQuery是: 我的JSON数组包含HTML,如下所示: 问题答案: 将此添加到您的代码: 因此