我的jquery-autocomplete插件和我的django脚本有问题。我想要一个易于使用的自动完成插件。对于我所看到的(http://code.google.com/p/jquery-autocomplete/),我觉得非常有用且容易。对于django部分我使用它(http://code.google.com/p/django-ajax-selects/)我稍微修改了一下,因为输出看起来有点像我一样。每个新行都有2'\ n',并且响应中没有Content-Length Header。首先我认为这可能是问题,因为我找到的所有在线示例都有它们。但那不是问题所在。
我的test.html非常小,包含以下内容:
<body>
<form action="" method="post">
<p><label for="id_tag_list">Tag list:</label>
<input id="id_tag_list" name="tag_list" maxlength="200" type="text" /> </p>
<input type="submit" value="Submit" />
</form>
</body>
这是用于向输入添加自动完成的JQuery调用。
function formatItem_tag_list(row) {
return row[2]
}
function formatResult_tag_list(row) {
return row[1]
}
$(document).ready(function(){
$("input[id='id_tag_list']").autocomplete({
url:'http://gladis.org/ajax/tag',
formatItem: formatItem_tag_list,
formatResult: formatResult_tag_list,
dataType:'text'
});
});
当我在Textfield Firefox(firebug)中输入内容时,Chromium-browser表明这是一个ajax调用但没有响应。如果我只是将该行复制到我的浏览器中,我就可以看到响应。(这个问题已经解决,这是ajax的一个安全功能,不能从另一个域获取数据)
例如,当我在文本字段中输入Bi时,会生成网址“http://gladis.org/ajax/tag?q=Bi&max ...”。当您在浏览器中输入此内容时,您会得到以下回复:
4|Bier|Bier
43|Kolumbien|Kolumbien
33|Namibia|Namibia
现在我的ajax调用获得了正确的响应,但仍然没有显示所有可能条目的列表。我也尝试格式化输出,但这也不起作用。我将制动点设置为该功能,并意识到它们根本不会被调用。
以下是指向我的最低HTML文件http://gladis.org/media/input.html
的链接有谁知道我做错了什么。我还将所有文件上传为
感谢您的帮助!
[编辑] 这是网址:
(r'^ajax/(?P<channel>[a-z]+)$', 'ajax_select.views.ajax_lookup'),
和ajax查找通道配置
AJAX_LOOKUP_CHANNELS = {
# the simplest case, pass a DICT with the model and field to search against :
'tag' : dict(model='htags.Tag', search_field='text'),
}
和视图:
def ajax_lookup(request,channel):
""" this view supplies results for both foreign keys and many to many fields """
# it should come in as GET unless global $.ajaxSetup({type:"POST"}) has been set
# in which case we'll support POST
if request.method == "GET":
# we could also insist on an ajax request
if 'q' not in request.GET:
return HttpResponse('')
query = request.GET['q']
else:
if 'q' not in request.POST:
return HttpResponse('') # suspicious
query = request.POST['q']
lookup_channel = get_lookup(channel)
if query:
instances = lookup_channel.get_query(query,request)
else:
instances = []
results = []
for item in instances:
results.append(u"%s|%s|%s" % (item.pk,lookup_channel.format_item(item),lookup_channel.format_result(item)))
ret_string = "\n".join(results)
resp = HttpResponse(ret_string,mimetype="text/html")
resp['Content-Length'] = len(ret_string)
return resp
答案 0 :(得分:1)
您可能需要在网址末尾添加一个斜杠。
此外,您的jQuery选择器是错误的。方括号内不需要引号。但是,无论如何,这个选择器写得更好:
$("input#id_tag_list")
或只是
$("#id_tag_list")
答案 1 :(得分:1)
单独回答,因为我刚想到了另一种可能性:您的静态页面是否与Ajax调用(gladis.org)在同一域中提供?如果不是,则同域策略将阻止加载Ajax。
答案 2 :(得分:0)
顺便说一下,假设你的document.ready在你的Django模板中,最好使用{%url%}标签,而不是硬编码你的网址。
$(document).ready(function(){
$("input[id='id_tag_list']").autocomplete({
url:'{% url my_tag_lookup %}',
dataType:'text'
});
});
这样,JS片段将使用计算出的URL进行呈现,您的代码将保持可移植性。
答案 3 :(得分:0)
我找到了一个解决方案,但我仍然不知道为什么第一种方法没有成功。我刚换到另一个图书馆。我选择http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/。这个实际上是由jQuery推广的,它可以工作;)