You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:18:17