如何在Django中遍历从JavaScript发送的字典列表并提取键值对?
解决Django接收JS数组后无法遍历提取键值对的问题
看起来你踩了一个常见的小坑:你发送的是整个数组的JSON字符串,但Django的getlist('data[]')拿到的其实是包含这个字符串的列表——你看到的打印结果看起来像字典列表,但本质是一个字符串,所以直接遍历当然没法提取键值对啦!
问题根源拆解
你前端代码里的{'data[]': JSON.stringify(arr)},相当于把整个数组转成单个JSON字符串,然后作为data[]的一个值发送。所以后端request.POST.getlist('data[]')得到的是类似["[{\"k\":\"v1\"}, {\"k\":\"v2\"}]"]的列表——只有一个元素,这个元素是完整的JSON字符串,不是已经解析好的字典数组。
两种解决方案
方案一:直接发送JSON数据(推荐)
这种方式更简洁,前后端维护起来都省心:
前端代码(用fetch为例)
// 假设你的目标数组是arr fetch('/your-django-endpoint/', { method: 'POST', headers: { 'Content-Type': 'application/json', // 别忘了Django要求的CSRF令牌,根据你的项目获取方式调整 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value }, body: JSON.stringify(arr) });
后端Django代码
import json def your_view(request): if request.method == 'POST': # 直接解析request.body里的JSON数据 parsed_data = json.loads(request.body) # 现在parsed_data就是你要的字典列表,可以直接遍历 for item in parsed_data: # 提取每个对象的键值对,比如item['k'] print(f"键k对应的值: {item['k']}") # 后续业务逻辑...
方案二:保持表单提交形式,逐个发送数组元素
如果因为项目限制必须用表单形式发送,可以把数组里的每个对象单独转成JSON,再添加到data[]中:
前端代码(用FormData)
const formData = new FormData(); const arr = [ {k: 'v1'}, {k: 'v2'} ]; // 遍历数组,把每个对象转成JSON后添加到formData arr.forEach(item => { formData.append('data[]', JSON.stringify(item)); }); fetch('/your-django-endpoint/', { method: 'POST', body: formData, headers: { 'X-CSRFToken': document.querySelector('[name=csrfmiddlewaretoken]').value } });
后端Django代码
import json def your_view(request): if request.method == 'POST': # 获取所有data[]的值,每个都是单个对象的JSON字符串 raw_data_list = request.POST.getlist('data[]') # 逐个解析成字典 parsed_data = [json.loads(item) for item in raw_data_list] # 现在可以正常遍历提取键值对了 for obj in parsed_data: print(f"当前对象的k值: {obj['k']}") # 后续业务逻辑...
验证小技巧
你可以在后端先打印type(req),如果显示是<class 'str'>,说明拿到的是字符串,必须先解析。如果是<class 'list'>,再检查每个元素的类型,确保是字典而不是字符串。
内容的提问来源于stack exchange,提问作者nashvilleCoder
相关产品推荐
相关产品推荐

