如何在 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 字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中使用 ajax 更新绘图图

如何使用 Ajax 在 Django 中更新 modelForm

上传文件后,如何在 Django 中使用 AJAX 更新表(与 JavaScript 链接)?

Django中Ajax处理

如何从ajax成功函数返回数据?

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