如何在 django ajax 更新中返回 json 字典
Posted
技术标签:
【中文标题】如何在 django ajax 更新中返回 json 字典【英文标题】:How to return json dictionary in django ajax update 【发布时间】:2013-02-12 21:34:35 【问题描述】:我多次问这个问题,因为我没有收到任何适用的帮助。
我的问题是我不知道如何将查询结果作为 ajax 响应返回到模板。
我这样做了:
if request.path == "/sort/":
sortid = request.POST.get('sortid')
locs = Location.objects.order_by(sortid)
if request.is_ajax():
return HttpResponse(locs,mimetype="application/json")
那么我的 ajax done
函数会这样做:
).done(function(data)
$('.sortierennach').html(data);
);
现在发生的是它只是替换了.sortierennach
的内容,它没有渲染 django dic,所以我可以这样做:
% for loc in locs %
loc.name
% endfor %
谁能帮帮我...非常感谢
【问题讨论】:
对于这种排序功能,您应该真正使用 GET 方法,而不是 POST,因为您不会更改服务器上的任何内容,因此将来您可以附加一个 ETag 或类似的缓存响应。 【参考方案1】:您需要将对象列表导出到 JSON 字典。
if request.path == "/sort/":
sortid = request.POST.get('sortid')
locs = Location.objects.order_by(sortid)
if request.is_ajax():
import json
return HttpResponse(json.dumps(locs), mimetype="application/json")
但是,这需要您使用某种类型的客户端模板系统。
更好的方法是使用 Django 的 render_to_response
快捷方式。您实际上并不“需要”使用 JSON 进行响应。你可以用一个字符串来响应请求。
我通常为 AJAX 驱动的东西创建两个模板。第一个是部分模板,它仅包含我希望在 AJAX 更新期间更新的特定 HTML 位。第二种是包装器,可以在视图正常调用时使用。
一个便宜的例子,这是我的 object_list.html:
<ul id='object-list'>
% for object in object_list %
<li> object.value </li>
% endfor %
</ul>
这是我的 base.html:
<html>
<title>Example</title>
<body>
% include 'object_list.html' %
</body>
</html>
对于视图,您需要这样做:
from django.shortcuts import render_to_response
from django.template import RequestContext
from models import Location
def view(request):
locs = Location.objects.order_by(sortid)
if request.is_ajax():
return render_to_response('object_list.html', 'object_list': locs, context_instance=RequestContext(request))
return render_to_response('base.html', 'object_list': locs, context_instance=RequestContext(request))
这让我们可以通过标准 GET 或 XHTTP 请求正常调用视图,只返回您想要更新的部分 HTML。好用!
【讨论】:
谢谢,我现在就试试这个。所以我会用render_to_response
而不是json,对吧?
是的,先生。如果您只是通过 HTML 字符串发送,则不需要使用 JSON。
这是一个模糊且难以诊断的说法。
我的问题是如何在 ajax 响应函数中返回到前端的表。 .done(function(data) how to give this queryset back to table again? )
让我们continue this discussion in chat【参考方案2】:
如果您首先尝试在 ajax 函数中填充值,则需要将 queryset 对象转换为 json 对象,例如
if request.path == "/sort/":
sortid = request.POST.get('sortid')
locs = Location.objects.order_by(sortid)
if request.is_ajax():
locs = json.dumps(locs)
return HttpResponse(locs,mimetype="application/json")
现在在您的 ajax 代码中,您将收到 json 数据。
因此,通过使用此 locs 数据,您可以在 Ajax 中生成 html 或任何您想做的事情。
【讨论】:
以上是关于如何在 django ajax 更新中返回 json 字典的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ajax 在 Django 中更新 modelForm