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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:10