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

Ajax向Django传二维数组后无法正确获取数组索引值的问题

问题原因
  • 你通过ts.push(t)传递到后端的targets[]数组里的每一项都是JSON序列化后的字符串,不是原生数组对象。你直接对字符串取下标,取到的是字符串对应位置的单个字符,不是数组对应索引的元素,所以才会拿到逗号,返回的长度也是整个字符串的字符数,不是数组的元素个数。
  • 你最早直接把整个targets序列化后传递的方式,后端拿到的也是一整个JSON字符串,同样不能直接取下标操作。
正确处理方案

方案1:沿用当前ts.push(t)的传参方式

后端拿到每个target字符串后,先做JSON反序列化转成Python列表再操作,示例代码:

import json

targets = request.POST.getlist('targets[]')
for target_str in targets:
    # 先反序列化为Python列表
    target = json.loads(target_str)
    # 此时可正常取索引值
    print(target[1]) # 即可得到 "25, 25, 25" 或者 ""
    # 后续存入数据库操作:直接取对应索引赋值即可
    id_val = target[0]
    weight_val = target[1]
    unit_val = target[2]
    note_val = target[3]
    # 补充你的ORM保存逻辑即可

方案2:修改传参方式,直接传递整个序列化后的数组(代码更简洁)

前端不用拆分单个元素push,就用你最开始的targets:JSON.stringify(targets)写法,后端一次反序列化即可拿到完整二维数组:
前端AJAX代码保持最初写法不变:

$.ajax({
    type: 'POST',
    url: '',
    dataType: 'json',
    data:{
        csrfmiddlewaretoken: csrftoken,
        targets:JSON.stringify(targets),
    },
    success: (res)=>{
        console.log(res)
    },
    error: (error)=>{
        console.log(error)
    }
})

后端处理代码:

import json

# 直接读取targets字符串并反序列化
targets_str = request.POST.get('targets')
targets = json.loads(targets_str)
# 此时targets就是前端传入的二维数组,直接遍历操作即可
for target in targets:
    print(target[1]) # 输出你需要的内容
    # 后续存入数据库的操作和方案1一致
注意事项
  • 反序列化操作要确保输入的是标准JSON格式,不要有多余引号或转义错误,生产环境建议加try-except捕获JSON解析异常。
  • 如果你后续修改AJAX配置添加了contentType: 'application/json',后端就不能从request.POST拿数据,需要从request.body读取内容后再反序列化,你当前用的默认表单提交格式,用request.POST取值是正常的。

内容的提问来源于stack exchange,提问作者Little_Cookie_Eater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:03