Django receive list by jQuery ajax POST

12 篇文章 0 订阅

jQuery POST:

post_obj = {"new_member": ["a","b","c"]}

$.ajax({
    type: "POST",
    url: url,
    cache: false,
    dataType: 'json',
    data: post_obj,
    success: function(data){ },
    error: function(){ },
});

直接这样传数组应该没什么问题,但是Django后台通过request.POST.getlist("new_member")并没有得到任何数据。通过查看请求数据发现变量名new_member变成了new_member[]。然后通过request.POST.getlist("new_member[]")可以得到["a","b","c"]。

显然这样很不合理。解决方法有三种:

方法一、将数组new_member 通过join(',')拼接成字符串传递,后端接收到参数后再通过split 指定的分隔符来得到原数组。

    但是这个方法存在一个问题:如果数组中的元素也存在你所制定的分隔符(如:','),那么后端split时就会出现错误数据!

方法二、传递数据之前把data dumps成json字符串。后端获取数据时再loads。这个方法没什么问题,缺点就是稍麻烦。

方法三、在ajax中添加参数traditional:true。或者在ajax之前设置 jQuery.ajaxSettings.traditional = true;

为什么要这样?因为jQuery传递参数之前会通过jQuery.param( obj, traditional )来序列化参数。traditional默认为false,这时jQuery会深度序列化参数,浏览器中查看network发现传输时参数变成了new_member='a'&new_member='b'&new_member='c'。所以你如果用request.POST.get('new_member')获取参数时,得到的总是最后一个参数。

将traditional设置为true,阻止jQuery的这步操作就可以将原始数据传递给后台了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值