通过AJAX传递数组数据至Django views.py时部分数据丢失
问题描述
通过AJAX向Django项目的views.py传递数组数据时,已完成基础传参逻辑编写,但views.py无法获取全部传入数据,存在部分数据缺失。
前端收集选中复选框值时,SelectedID数组共包含10条记录,但views.py中打印获取到的SelectedID仅返回6条记录,其余数据丢失。
原有问题代码
display.html(前端)
var SelectedID = []; function getvalues() { $(':checkbox:checked').each(function (i) { SelectedID[i] = $(this).val(); console.log("Selected Data", SelectedID[i]) $.ajax({ url: "{% url 'addtoexisting' bid=adduser.id %}", type: "POST", dataType: "json", data:{ SelectedID : SelectedID[i], csrfmiddlewaretoken: '{{ csrf_token }}' }, success: function (data) { console.log("Selected Data AJAX", SelectedID) alert("Successfully sent the Data to Django"); }, error: function (xhr, errmsg, err) { // alert("Could not send URL to Django. Error: " + xhr.status + ": " + xhr.responseText); } }); }); }
views.py(后端)
def display(request): is_ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest' if is_ajax and request.method == "POST": SelectedID = request.POST.get('SelectedID') print(SelectedID) return render(request, 'display.html',{})
问题原因
- AJAX请求错误写在了
.each()遍历循环内部,每遍历一个选中项就单独发一次POST请求,每次请求仅传递单个值,从未传递完整数组。 - 短时间并发发送多个POST请求时,无队列控制的情况下会出现请求竞争,部分请求未被后端正常接收处理,最终只拿到部分数据。
- 后端使用
request.POST.get()获取参数,该方法仅能返回参数的单个值,即使传递数组也无法拿到完整列表。
修复方案
前端修改
先遍历收集完所有选中值组装成完整数组,再一次性发送AJAX请求;传递数组时给参数名添加[]后缀,方便Django识别为列表类型。
修正后代码:
var SelectedID = []; function getvalues() { // 清空数组,避免重复触发时累加历史数据 SelectedID = []; // 第一步:遍历收集所有选中复选框的值 $(':checkbox:checked').each(function (i) { SelectedID.push($(this).val()); console.log("Selected Data", SelectedID[i]) }); // 第二步:收集完成后一次性提交完整数组 $.ajax({ url: "{% url 'addtoexisting' bid=adduser.id %}", type: "POST", dataType: "json", data:{ "SelectedID[]": SelectedID, csrfmiddlewaretoken: '{{ csrf_token }}' }, success: function (data) { console.log("Selected Data AJAX", SelectedID) alert("数据提交成功"); }, error: function (xhr, errmsg, err) { console.log("提交失败,错误码:" + xhr.status); } }); }
后端修改
使用getlist()方法获取数组类型参数,同时给AJAX请求返回正确的JSON格式响应,避免前端触发解析错误。
修正后代码:
from django.http import JsonResponse def display(request): is_ajax = request.headers.get('x-requested-with') == 'XMLHttpRequest' if is_ajax and request.method == "POST": # getlist会返回参数对应的完整值列表 SelectedID = request.POST.getlist('SelectedID[]') print(SelectedID) # 此处可打印出完整的10条选中ID # 编写后续业务逻辑 return JsonResponse({"code": 0, "msg": "接收成功"}) return render(request, 'display.html',{})
内容的提问来源于stack exchange,提问作者user19350831
相关产品推荐
相关产品推荐

