1、这几天遇到了django ajax请求出错的问题,总结一下
前端js:我这里创建的是一个字典格式的数据,前端js收到字典之后也是要用字典的形式去解包后台传送过来的数据,比如我下面的写法:data[‘status’],因为我后台传输的字典键是’status’
$(".check").click(function(){
debugger;
var data=$(this).attr("id");
var csrf_token =$("input[name='csrfmiddlewaretoken']").val();
$.ajax({
url:'/shouli',
type:"POST",
dataType:"json",
data:{'data':data, 'csrfmiddlewaretoken':csrf_token},
success:function(data){
status = data['status'];
if(status==0){
alert(1);
}
else{
alert(2);
}
},
error : function(data){
alert("报错");
}
});
});
django views处理,主要是用json.dumps()把需要发送的内容转换一下发给前端,然后HttpResponse里面指定content_type=‘application/json’
if request.method == 'POST':
print('post')
# 若提交的是ajax请求
if request.is_ajax():
doc_id = request.POST.get('data')
print doc_id
status = models.Status.objects.get(pk=models.Doc.objects.get(pk=doc_id).status_id).pk
# status = models.Doc.objects.get(pk=doc_id).status_id
print status
if status == 7:
res = 0
else:
res = 1
print res
return HttpResponse(json.dumps({'status':res}),content_type='application/json')
2、以上方法只能适用于简单的ajax传输,但是当传输models的查询集/QuerySet对象的时候,以上方法就不适用了,需要用到djando的两个模块:serializers(用来封装查询集的对象),JsonResponse (返回封装好的集合/对象,相当于上面1的HttpResponse)
#首先在views.py导入下面2个模块
from django.http import JsonResponse
from django.core import serializers
#封装返回
#我的购物车
def myBuyCar(request):
if request.method == 'POST':
if request.is_ajax():
user_id = request.POST.get('user_id')
print 'buyid =',user_id
obj = BuyThing.objects.filter(user_id = user_id)
print 'obj :',obj
obj = serializers.serialize('json', obj) #封装
results = {}
results['obj'] = obj
print results['obj']
return HttpResponse(JsonResponse(results), content_type="application/json")
#封装完之后是一个大的字典的形式,可以输出看到需要的信息他会封装到一个key为fields(固定的,不变,所有的封装都是这么个,你的也一样)的字典里面
此时,前端js的写法如下:
<!-- 我的购物车 -->
<script type="text/javascript">
$(document).ready(function(){
// 把js绑定到document上,即永久绑定该文档,局部刷新之后也会绑定js
$(document).on('click', '#mycar', function(e) {
userid = $("#userid").text();
var csrf_token =$("input[name='csrfmiddlewaretoken']").val();
$('.inner').empty();
$.ajax({
url:"{% url 'mybuycar' %}",
type:"POST",
dataType:"json",
data:{"user_id":userid,'csrfmiddlewaretoken':csrf_token},
success:function(data){
data = data['obj'];
var data_json = JSON.parse(data); <!-- 用此方式解包 -->
$(".inner").append("<table>"+"<tr>"+"<td>"+"名称"+"</d>"+"<td>"+"图片"+"</d>"+"<td>"+"单价(¥)"+"</d>"+"<td>"+"购买数量"+"</d>"+"<td>"+"总价(¥)"+"</d>"+"<td>"+"卖家"+"</d>"+"<td>"+"卖家联系方式"+"</d>"+"</tr>"+"</table>");
<!-- 循环获取每一个对象集合的数据 -->
$.each(data_json,function(i,item){
var vfields = item.fields;
var buy_thing = vfields.buy_thing;
$(".inner table").append("<tr>"+"<td>"+vfields.buy_name+"</td>"+"<td> <img src=/media/"+vfields.buy_thing+"/> </td>"+"<td>"+vfields.price+"</td>"+"<td>"+vfields.buy_num+"</td>"+"<td>"+vfields.prices+"</td>"+"<td>"+vfields.buy_resource+"</td>"+"<td>"+vfields.buy_resourcetel+"</td>"+"</tr>");
})
},
error:function(data){
alert("报错");
}
});
});
});
</script>