如何在Django中返回JSON字典以更新AJAX
我已经多次问这个问题,因为没有人能给我有效的帮助。
我的问题是,我不知道怎么把查询结果返回到模板作为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字典,这样我就不能这样做:
{% for loc in locs %}
{{loc.name}}
{% endfor %}
有人能帮帮我吗...非常感谢
2 个回答
1
如果你想在ajax函数中填充值,首先需要把查询集对象转换成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,或者做你想做的任何事情。
4
你需要把你的对象列表导出成一个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。很方便!