jquery-autocomplete не работает с моим приложением django - PullRequest
0 голосов
/ 25 февраля 2010

У меня проблема с подключением jquery-autocomplete и моим сценарием django. Я хочу простой в использовании плагин автозаполнения. И для того, что я вижу это (http://code.google.com/p/jquery-autocomplete/), кажется очень полезным и легким. Для django я использую это (http://code.google.com/p/django-ajax-selects/) Я немного изменил его, потому что выход выглядел немного утомленным, чтобы меня. У него было 2 '\ n' для каждой новой строки, и в ответе не было заголовка Content-Length. Сначала я подумал, что это может быть проблемой, потому что все онлайн-примеры, которые я нашел, имели их. Но это было не проблема.

У меня очень маленький файл 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.

Спасибо за вашу помощь!

[Изменить] Вот URL ссылки:

(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 ]

1 голос
/ 25 февраля 2010

Отдельный ответ, потому что я только подумал о другой возможности: ваша статическая страница обслуживается из того же домена, что и вызов Ajax (gladis.org)? В противном случае политика того же домена будет препятствовать загрузке Ajax.

1 голос
/ 25 февраля 2010

Возможно, вам нужен косая черта в конце URL.

Кроме того, ваш селектор jQuery неверен. Вам не нужны кавычки в квадратных скобках. Тем не менее, этот селектор лучше написать так:

$("input#id_tag_list")

или просто

$("#id_tag_list")
0 голосов
/ 10 апреля 2010

Я нашел решение, но я все еще не знаю, почему первый подход не сработал.Я просто переключился на другую библиотеку.Я выбираю http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/. На самом деле это продвигается jQuery, и он работает;)

0 голосов
/ 25 февраля 2010

Кроме того, предполагая, что ваш document.ready находится в вашем шаблоне Django, было бы неплохо использовать тег {% url%} вместо жесткого кодирования вашего URL.

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

Таким образом, фрагмент JS будет отображаться с вычисленным URL, а ваш код останется переносимым.

...