2010-02-25 6 views
0

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

У меня есть очень небольшой 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) и Хром-браузер указывает на то, что Ther является вызов Ajax, но без ответа. Если я просто скопирую строку в свой браузер, я увижу ответ. (этот вопрос решается, это функция безопасности с помощью AJAX, чтобы не получить данные из другого домена)

Например, когда я печатал Bi в текстовом поле, URL-адрес "http://gladis.org/ajax/tag?q=Bi&max ... генерируются. При вводе это в вашем браузере вы получите такой ответ:

4|Bier|Bier 
43|Kolumbien|Kolumbien 
33|Namibia|Namibia 

Теперь мой Аякс вызова получить правильный ответ, но до сих пор нет списка показа всех возможных записей я пытался также формат вывода, но это Безразлично. Я тоже работаю. Я установил функции brakepoints и понял, что они вообще не будут называться.

Вот ссылка на мой минимальный HTML-файл http://gladis.org/media/input.html

Кто-нибудь знает, что я сделал не так. Я также загрузил все файлы в виде небольшого почтового индекса на http://gladis.org/media/example.zip .

Благодарим за помощь!

[Редактировать] здесь является URLs конф:

(r'^ajax/(?P<channel>[a-z]+)$', 'ajax_select.views.ajax_lookup'), 

и конфигурация

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

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

1

Вы, вероятно, нужно конечная косая черта в конце URL-адреса.

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

$("input#id_tag_list") 

или просто

$("#id_tag_list") 
+0

Нет, мне не нужна конечная косая черта. На самом деле это не сработает. Это связано с конфигурацией URL. Как я уже говорил выше, когда я копирую URL и вставляю его в браузер, все работает нормально. Но спасибо за подсказку с селекторами! –

0

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

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

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

+0

Конечно, когда я конвертирую это в шаблон django, я его изменю. Но сейчас я хочу, чтобы эта автозаполнение также работала на мою статическую версию. Если будет слишком много, то будет трудно найти реальную ошибку. –

+0

Возможно, вы сможете разместить свои соответствующие URL-адреса и просмотреть? –

1

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

+0

нет, прямо сейчас я просто использую его как локальный файл. И откройте его с файлом: /// ... Я загружу свой файл и снова его проведу. Thx –

+0

Я просто загрузил файл и получил возврат. Так что это было правильное направление !!! К сожалению, автозаполнение все еще не работает. Я также вернул функции format_item и format_result. –

Смежные вопросы