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