0

我的 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 时,会生成 URL“ 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将所有文件以小 zip 的形式上传。

感谢您的帮助!

[编辑] 这里是 urls conf:

(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

4 回答 4

1

您可能需要在 URL 末尾添加一个斜杠。

此外,您的 jQuery 选择器是错误的。您不需要方括号内的引号。但是,无论如何,该选择器最好这样写:

$("input#id_tag_list")

要不就

$("#id_tag_list")
于 2010-02-25T18:49:13.590 回答
1

单独的答案,因为我刚刚想到了另一种可能性:您的静态页面是否与 Ajax 调用 (gladis.org) 来自同一个域?如果没有,同域策略将阻止加载 Ajax。

于 2010-02-25T19:37:58.113 回答
0

顺便说一句,假设您的 document.ready 在您的 Django 模板中,最好使用 {% url %} 标记而不是硬编码您的 URL。

$(document).ready(function(){
    $("input[id='id_tag_list']").autocomplete({
        url:'{% url my_tag_lookup %}',
        dataType:'text'
    }); 
});

这样,JS 片段将使用计算的 URL 呈现,并且您的代码将保持可移植性。

于 2010-02-25T19:05:40.690 回答
0

我找到了一个解决方案,但是我仍然不知道为什么第一种方法没有奏效。我刚刚切换到另一个图书馆。我选择http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/。这个实际上是由 jQuery 推广的,它可以工作;)

于 2010-04-10T16:00:32.517 回答