之前已经问过这个问题,我想我已经完成了我在那里看到的,但我真的不知道我做错了什么。我对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 :(得分:3)
<强>更新强>
如果你给它一个URL, autocomplete
不会自动处理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]))
但您可以改进查询以直接返回字符串列表。如果您需要帮助,则需要发布整个代码。
答案 1 :(得分:1)
你实际上甚至不需要请求来完成这项工作!使用标准的jquery-ui自动完成功能,您可以将可能的项目放入jinja变量中,然后:
<script type="text/javascript">
$('#search_form').autocomplete({
source: JSON.parse('{{jinja_list_of_strings | tojson | safe}}'),
minLength: 2,
delay: 10,
});
</script>
如果项目与current_user
相关联,则非常方便,如Flask-Login中所示。
<script type="text/javascript">
$('#search_form').autocomplete({
source: JSON.parse('{{current_user.friends | map(attribute="name") | list | tojson | safe}}'),
minLength: 2,
delay: 10,
});
</script>