django ajax练习

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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值