在Flask中使用jQuery自动完成功能

发布于 2021-01-29 15:20:20

这个问题以前曾被问过,我想我已经做了我在那儿看到的事情,但是我真的不知道我在做什么错。我对jQuery不太了解,但是我会尽力解释我要做什么。

我想根据来自数据库的查询自动完成,所以我的模板中有这个:

<script type="text/javascript">
    $(function() {
        $( "#function_name" ).autocomplete({
            source: '{{url_for("autocomplete")}}',
            minLength: 2,
        });
    });
</script>

<form id="function_search_form" method="post" action="">
    {{form.function_name}}
</form>

表单是通过以下Flask表单类生成的:

class SearchForm(Form):
    function_name = TextField('function_name', validators = [Required()])

这是自动完成功能:

@app.route('/autocomplete')
def autocomplete():
    results = []
    search = request.args.get('term')
    results.append(db.session.query(Table.Name).filter(Table.Name.like('%' + search + '%')).all())
    return dumps(results)

因此,jQuery应该转到自动完成功能,并获取一些JSON以自动完成。至少我认为就是这样。我在这里做错了什么?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    更新:

    autocomplete 如果您给它一个URL,它不会自动处理Ajax请求,您必须手动执行:

    $(document).ready(function() {
        $.ajax({
            url: '{{ url_for("autocomplete") }}'
        }).done(function (data) {
            $('#function_name').autocomplete({
                source: data,
                minLength: 2
            });
        });
    }
    

    您可能必须修改处理返回数据的方式,具体取决于API返回的内容。

    更新2:

    在服务器端的查询结果如下所示:

    [[["string1"], ["string2"], ... ["stringn"]]]
    

    您可以在发送之前将其展平:

    import itertools
    flattened = list(itertools.chain.from_iterable(result[0]))
    

    但是您可能可以改进查询以直接返回字符串列表。如果您需要帮助,则需要发布整个代码。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看