Как правильно вернуть Json ответ на шаблон для ajax / jquery? - PullRequest
0 голосов
/ 15 марта 2020

Здесь я пытаюсь выполнить поиск с помощью ajax и jquery с моим django представлением. Когда я пытаюсь выполнить такой поиск, возвращая JsonReponse вместо html_template, он не возвращает данные ниже соответствующего id в html

Но когда я возвращаю html из django представления и создайте новый html для этих результатов поиска, и включение этого шаблона в исходный шаблон работает отлично, но я считаю, что это более длительный процесс, поэтому я попытался вернуть json ответ от просмотра и использовать объекты json в шаблоне, как это, но это не работает.

Как я могу решить это? Я думаю, что мне нужно работать на ajax части.

def search_users(request):
    q = request.GET.get('q')
    if q:
        users = get_user_model().objects.filter(is_active=True).filter(profile__full_name__icontains=q)
        data = {'users': users}

    else:
        users = get_user_model().objects.filter(is_active=True)
        data = {'users':users}
    return JsonResponse(data)

ajax

$(function() {
    $('#search_users').keyup(function() {

        $.ajax({
            type: "GET",
            url: "{% url 'dashboard:search_users' %}",
            data: {
                'q' : $('#search_users').val(),

            },
            success: searchSuccess,
            dataType: 'json'
        });
    });
  });


function searchSuccess(data, textStatus, jqXHR)
{
    $('#search_users_results').json(data) #doing html instead of json works after returning html from django view 
}

В терминале

TypeError: Object of type QuerySet is not JSON serializable
[15/Mar/2020 14:02:53] "GET /admin/dashboard/search/users/?q=tyj HTTP/1.1" 500 22660

1 Ответ

1 голос
/ 15 марта 2020

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

Итак, вы можете просто добавить .values() в конце и внесите в список, как показано ниже -

data = {'users': list(users.values())}

Вы можете сослаться на него здесь .

...