jquery-autocomplete不适用于我的django应用程序

时间:2010-02-25 18:41:13

标签: django jquery-autocomplete

我的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

的链接

有谁知道我做错了什么。我还将所有文件上传为 http://gladis.org/media/example.zip 的小拉链。

感谢您的帮助!

[编辑] 这是网址:

(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

4 个答案:

答案 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推广的,它可以工作;)