Django окно поиска автозаполнения JQuery не отображаются результаты - PullRequest
0 голосов
/ 16 октября 2018

Я просмотрел несколько ресурсов в Интернете, чтобы использовать jquery autocomplete для заполнения окна поиска.

Однако, когда я набираю search box, вместо того, чтобы возвращать результаты поиска, возвращается No Results. Другая проблема заключается в том, что этот No Results не отображается как обычный выпадающий список.ниже search box.Вместо этого он отображается как текст под search box.

Есть мысли?

add_new_schedule.html

<!-- jquery, jqueryui, bootstrap4 cdn are used in the headers -->

<input class="form-control" id="id_test" name="test">    <!-- this is the search box -->

jquery

$(document).ready(function () {
    $('#id_test').autocomplete({
        source: "",
        minLength: 1,
        autoFocus: true,
    });
});

views.py

import json

...
...

def add_new_schedule(request):
    if request.user.is_authenticated:

        if request.GET and request.is_ajax():
            q = request.GET.get('term')
            print(q)
            student_object = Student.objects.filter(first_name__startswith=q)
            results = []
            for r in student_object:
                results.append(r.first_name)
            data = json.dumps(results)
            print(results)
        else:
            data = 'fail'
        mimetype = 'application/json'
        return render(request, 'static/html/add_new_schedule.html')

На этом этапе, когда я печатаю в search box, print(results) выведет список возможных совпадений из базы данных Student.Однако этот результат не возвращается в search box ...

urls.py

path('schedule/add-new-schedule/', views.add_new_schedule, name='add_new_schedule')

1 Ответ

0 голосов
/ 16 октября 2018

В сущности, вы только когда-либо возвращали HTML из своего представления.Вам нужно иметь способ вернуть созданный вами JSON data.

Похоже, вы уже разветвляете, является ли запрос AJAX.Поэтому все, что вам нужно сделать, это вернуть немного JSON в конце этой ветви:

def add_new_schedule(request):
    if request.user.is_authenticated:

        if request.GET and request.is_ajax():
            q = request.GET.get('term')
            print(q)
            student_object = Student.objects.filter(first_name__startswith=q)
            results = []
            for r in student_object:
                results.append(r.first_name)
            return JsonResponse(results, safe=False)

        else:
            return render(request, 'static/html/add_new_schedule.html')

JsonResponse автоматически устанавливает тип mime и кодирует его в JSON.safe=False позволяет передавать список, а не словарь.Согласно документам Django, проходные списки (которые стали массивами Javascript) изначально считались небезопасными, но Javascript устранил проблему в 2011 году, поэтому, вероятно, сейчас не о чем беспокоиться.

Технически вам не нужны последниеelse, вы можете просто отступить на return render....Это действительно стилистический выбор.

Что касается местоположения сообщения об ошибке на веб-странице, возможно ли, что вы не включили какой-то необходимый CSS или у вас есть собственный CSS с теми же именами классов?

...