Возвращение двух вещей в одном HttpResponse - PullRequest
2 голосов
/ 29 сентября 2010

Я пытаюсь реализовать пейджинг через вызовы ajax.Страница не должна обновляться, когда пользователь хочет увидеть следующее число результатов.

Вот моя проблема.Возврат QuerySet очень прост.Я просто делаю (sumaJson настраивается)

data = serializers.serialize('sumaJson', result_page.object_list, relations=('first_major', 'country_of_origin', 'second_major'))
return HttpResponse(data, mimetype="application/json") 

Теперь я также хочу вернуть такие вещи, как

result_page.has_previous()
result_page.has_next()
result_page.paginator.count

и так далее.Я за всю свою жизнь не могу понять, как объяснить оба в одном ответе.Я не могу добавить эту информацию в result_page.object_list, потому что тогда не работает сериализатор.Если я что-то вроде

simplejson.dumps(paging_info + result_page.object_list)

, тогда в javascript QuerySet больше не является списком объектов, а представляет собой просто большую строку символов, которые нельзя интерпретировать с помощью

$.each(data.data, function(index, item){

Я попробовал несколько плохих хаков, таких как создание поддельного объекта и помещение его в список_объектов, сериализация и последующее удаление объекта.Это позволяет мне передавать данные.Однако я не хочу создавать и удалять поддельные объекты.

Я не хочу вмешиваться в сериализатор.Я не хочу отправлять второй ajax-запрос, как только я получаю набор запросов обратно, чтобы получить информацию о подкачке.

Я что-то упустил?Есть ли простой способ донести их до одного ответа?Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 сентября 2010

Когда я сериализую коллекцию объектов, я обычно включаю информацию о разбиении на страницы в самом теле ответа.Если бы у меня было 50 объектов, которые я хотел бы обработать по 10 на страницу, JSON выглядел бы примерно так:

1 голос
/ 29 сентября 2010

simplejson.dumps () может сериализовать словари глубоко, даже рекурсивно.

Существует два подхода к этому.Первый - использовать метод values ​​() Django ORM в QuerySets: он производит чистые словари python с идентификаторами объектов вместо ссылок, подходящих для сериализации.

Если вам нужно еще глубже, вам, возможно, придется написать что-то, чтобы создать структуру словаря, предложенную jpwatts.Если вам нужна такая сила, у меня есть запись в моем личном блоге о добавлении функторов, генераторов, итераторов и замыканий в simplejson.Пример демонстрирует, как превратить древовидную структуру Treebeard в объект javascript.

Код:

from django.utils.simplejson.encoder import JSONEncoder

class ExtJsonEncoder(JSONEncoder):
    def default(self, c):
        # Handles generators and iterators
        if hasattr(c, '__iter__'):
            return [i for i in c]

        # Handles closures and functors
        if hasattr(c, '__call__'):
            return c()

        return JSONEncoder.default(self, c)

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

1 голос
/ 29 сентября 2010

В прошлом я делал для вызовов ajax то, что я возвращаю json как HttpResponse, как вы делаете, и добавляю заголовок для любых дополнительных полей, которые я хочу вернуть.

data = serializers.serialize('sumaJson', result_page.object_list, relations=('first_major', 'country_of_origin', 'second_major'))
response = HttpResponse(data, mimetype="application/json") 
response['X-VALUE'] = 'asdf' #this is the header, you can create as many of these as you'd like
return response

и на стороне JavaScript ...

$.ajax({
  url: '/whatever/here/',
  success: function(data, code, xhr) {
    alert(xhr.getResponseHeader('X-VALUE'));
  }
});

надеюсь, это поможет.

...