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
相关产品推荐
相关产品推荐

