如何在 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反向和重定向
如何清除以前的 AJAX 响应数据(不是 html/表单数据)? - Django/AJAX