Как вернуть несколько объектов JSON в запросе AJAX в Django - PullRequest
2 голосов
/ 16 января 2012

В настоящее время у меня есть представление, которое я отображаю в шаблоне и возвращаю ему два списка запросов. Мой вид, как показано ниже

def view_notifications(request,user_id):

    context_instance=RequestContext(request)
    user = User.objects.get(pk=user_id)

    user.profile.notifications = 0
    user.profile.save()

    notices = list(notifications.objects.filter(n_reciever=user.id, is_read=0).order_by('-time'))
    number = notifications.objects.filter(n_reciever=user.id, is_read=0).order_by('-time').count()

    if number < 5:
        old_notices = list(notifications.objects.filter(n_reciever=user.id, is_read=1).order_by('-time')[:5])
    else:
        old_notices = False

    notifications.objects.all().update(is_read = 1)

    return render_to_response('profiles/notifications.html', {'New_Notice': notices, 'Old_Notices':old_notices, 'number': number,},context_instance=RequestContext(request))

В моем шаблоне я перебираю два списка и задаю цвет фона для объектов списка, новых как

<ul id="notification_list">
    <li id="first"></li>
    {% for notice in New_Notice %}
        <li class="new"> <a href="{{notice.n_sender.profile.get_absolute_url}}">{{ notice.n_sender.profile.url_name}} </a> {{notice.message}} your <a href="{{notice.object_url}}"> {{notice.object_type}}</a></li>
    {% endfor %}
    {% for notice in Old_Notices %}
        <li> <a href="{{notice.n_sender.profile.get_absolute_url}}">{{ notice.n_sender.profile.url_name}} </a> {{notice.message}} your <a href="{{notice.object_url}}"> {{notice.object_type}}<a/></li>
    {% endfor %}
</ul>

Теперь я хочу сделать то же самое с помощью вызова AJAX и отобразить эти объекты в раскрывающемся списке, а не на новой странице, чтобы пользователь мог сам просматривать уведомления, не выходя из системы. Я не могу понять, как я могу отправить два JSON в кодировке object_lists. Я знаю, как сериализовать список объектов в JSON

data = serializers.serialize('json', notifications.objects.all())

Но можно ли таким образом отправить два списка объектов? Также я не знаю, как отобразить этот список закодированных объектов JSON в HTML. Могу ли я получить к нему доступ так же, как к объектам в шаблоне?

Пожалуйста, помогите

Ответы [ 2 ]

4 голосов
/ 16 января 2012

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

data1 = serializers.serialize('python', notifications.objects.all())
data2 = serializers.serialize('python', foobar.objects.all())

data = simplejson.dumps([data1, data2])

(Или вы можете использовать словарь, если поиск по ключу будет проще в вашем javascript.)

2 голосов
/ 16 января 2012

Я бы инициировал пустой список, перебрал бы уведомления и добавил в ваш список диктовку, содержащую все необходимые атрибуты. Например, ваш список new_notices может выглядеть так:

[{'absolute_url': 'blah', 'url_name': 'blah', 'message': 'blah', 'type': 'blah'},
 {'absolute_url': 'foo', 'url_name': 'foo', 'message': 'foo', 'type': 'foo'}]

После того, как вы создали список для каждого набора уведомлений (старых и новых), вы можете отправить их:

from django.utils import simplejson
from django.http import HttpResponse
...
json = simplejson.dumps({'old': old_notices, 'new': new_notices})
return HttpResponse(json, mimetype='text/json')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...