如何在 django 的 AJAX 请求中返回多个 JSON 对象

Posted

技术标签:

【中文标题】如何在 django 的 AJAX 请求中返回多个 JSON 对象【英文标题】:How to return multiple JSON objects in an AJAX request in django 【发布时间】:2012-02-11 13:52:46 【问题描述】:

目前我有一个视图,我将其渲染到模板并返回两个查询列表。我的看法如下图

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())

但是我可以这样发送两个 object_lists 吗?我也不知道如何在 html 中显示这个 JSON 编码的对象列表。我可以像访问模板中的对象一样访问它吗?

请帮忙

【问题讨论】:

【参考方案1】:

您想发送一个列表,由两个元素组成,每个列表一个元素。您可以通过先序列化到 Python,然后将全部转储到 JSON 来做到这一点。

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

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

(或者您可以使用字典,如果在您的 javascript 中按键查找会更容易。)

【讨论】:

哇,比我要发布的要好得多,尽管您肯定想使用字典而不是列表。 这会捕获外键上的方法,例如notice.n_sender.profile.get_absolute_url吗? 按键查找肯定会更容易,我是 Python 新手,所以请告诉我如何制作字典,其次我确实需要外键的完整对象。在这种情况下,我需要 n_sender 的整个对象 我会遍历模型并手动创建字典,确保您拥有所需的所有属性。 (正如我在回答中建议的那样)【参考方案2】:

我会启动一个空列表,遍历通知并将一个字典附加到您的列表中,其中包含所有必需的属性。例如,您的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')

【讨论】:

你能告诉我如何在我的 AJAX 成功调用中访问这些对象并将它们添加到正确的 html 标签中 另一件事是,对于n_sender,我可能不需要整个对象,但我需要 get_absolute_url 和发件人的更多字段。我知道我需要添加到要发送的字典中,但是如何将这些值附加到我获得的 query_set 中。你能告诉我如何构造一个字典,其中包含 query_set 的名称-值对和来自同一字典中相应 n_sender 对象的所需名称值对

以上是关于如何在 django 的 AJAX 请求中返回多个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何在 ajax 中返回模型表单集并在模板中使用

ajax请求返回django.urls.exceptions.NoReverseMatch后Django反向和重定向

jquery 多个ajax()请求。

如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX

django:csrf_token 用于单个页面上的多个表单和 ajax 请求

如何使用一个ajax请求从java servlet返回多个json对象