Django receive list by jQuery ajax POST

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的这步操作就可以将原始数据传递给后台了。

猜你喜欢

转载自blog.csdn.net/carrey_0612/article/details/85053491
今日推荐