Django 后端正确接收前端 Axios 传递的数组参数:原理与实践

夜浩同学_4637

夜浩同学_4637

2026-06-24

336人浏览

原创

Django 后端正确接收前端 Axios 传递的数组参数:原理与实践

本文详解 Django 如何准确接收前端通过 Axios 发送的 JSON 数组(如 [{nameDetail:"Size",valueDetail:"2oz"},...]),避免因 Content-Type 设置错误导致数组被拆解为扁平化键名(如 details[0][nameDetail]),并提供完整前后端示例与关键注意事项。

本文详解 django 如何准确接收前端通过 axios 发送的 json 数组(如 `[{namedetail:"size",valuedetail:"2oz"},...]`),避免因 `content-type` 设置错误导致数组被拆解为扁平化键名(如 `details[0][namedetail]`),并提供完整前后端示例与关键注意事项。

在使用 Axios 向 Django 后端提交包含嵌套数组的数据(例如商品详情字段 details: [{nameDetail: "Size", valueDetail: "2oz"}, {nameDetail: "Color", valueDetail: "White"}])时,开发者常遇到一个典型问题:后端 request.data 中该数组并未以原生 Python 列表形式存在,而是被解析为多个离散的 QueryDict 键(如 'details[0][nameDetail]': ['Size'])。这并非 Django 的 Bug,而是请求内容类型(Content-Type)与数据序列化方式不匹配所致。

? 问题根源:multipart/form-data 不支持嵌套结构的 JSON 数组

你当前的 Axios 请求设置了:

headers: {
  "Content-Type": "multipart/form-data", // ❌ 错误!
  Authorization: `Bearer ${userLogin.token}`,
}

multipart/form-data 是专为文件上传设计的编码格式,其底层机制将对象递归展开为扁平键名(类似 PHP 的数组序列化规则),因此 details[0][nameDetail] 这类键名正是浏览器/FormData 的默认行为。此时 Django 的 request.data 会将其视为表单字段而非 JSON 结构,自然无法还原为列表。

✅ 正确做法是:对数组及整个 payload 进行 JSON 序列化,并显式声明 application/json 类型。

PigX UI 前端开发
PigX UI 前端开发

PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。

下载

✅ 正确前端实现(Axios)

// 前端:确保 details 是标准数组,并整体 JSON.stringify
const payload = {
  name,
  brand,
  category,
  description,
  badge,
  price,
  discount,
  countInStock,
  images, // ⚠️ 注意:若 images 是 FileList 或 Blob,不能直接放 JSON 中!见下方说明
  details: JSON.stringify(details), // ✅ 关键:序列化数组
};

const { data } = await axios.post(
  'http://localhost:8000/api/products/product/add/',
  payload,
  {
    headers: {
      'Content-Type': 'application/json', // ✅ 必须匹配
      Authorization: `Bearer ${userLogin.token}`,
    },
  }
);

? 重要提示(文件上传场景):
若 images 字段需上传真实文件(如 ),则不可与 JSON 混合在 application/json 请求中。此时应拆分为两个请求:

  • 用 multipart/form-data 单独上传文件,获取返回的 URL;
  • 再用 application/json 提交商品主体数据(含 details 数组和已上传的图片 URL)。

✅ 正确后端处理(Django REST Framework)

确保已安装并配置 DRF(pip install djangorestframework),并在 settings.py 中启用:

INSTALLED_APPS += ['rest_framework']

在 views.py 中编写健壮的视图:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
import json

class ProductAddView(APIView):
    def post(self, request):
        try:
            # ✅ 直接读取 JSON 解析后的原生数据(DRF 自动处理)
            data = request.data

            # 获取 details 字段 —— 此时已是 Python list(前提是前端正确发送)
            details = data.get('details')

            # ⚠️ 如果前端仍用 stringify,则需手动解析(临时兼容方案)
            if isinstance(details, str):
                try:
                    details = json.loads(details)
                except json.JSONDecodeError:
                    return Response(
                        {"error": "Invalid JSON in 'details' field"},
                        status=status.HTTP_400_BAD_REQUEST
                    )

            # 验证是否为列表
            if not isinstance(details, list):
                return Response(
                    {"error": "'details' must be a JSON array"},
                    status=status.HTTP_400_BAD_REQUEST
                )

            # ✅ 安全遍历处理
            for idx, item in enumerate(details):
                name_detail = item.get('nameDetail')
                value_detail = item.get('valueDetail')
                if not (name_detail and value_detail):
                    return Response(
                        {"error": f"Missing 'nameDetail' or 'valueDetail' in details[{idx}]"},
                        status=status.HTTP_400_BAD_REQUEST
                    )
                print(f"Detail {idx}: {name_detail} = {value_detail}")

            # 此处可保存到数据库...
            # Product.objects.create(..., details_json=json.dumps(details))

            return Response({"message": "Product added successfully"}, status=status.HTTP_201_CREATED)

        except Exception as e:
            return Response(
                {"error": "Server error", "detail": str(e)},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

? 关键注意事项总结

项目 正确做法 错误做法
Content-Type 'application/json'(纯数据)或 'multipart/form-data'(仅文件) 混用(如 multipart/form-data 传 JSON 数组)
数组序列化 JSON.stringify(details) + 放入 JSON payload 直接传 JS 对象(Axios 默认转为 form-data 展开)
后端读取 request.data['details'](DRF 自动解析) request.POST.getlist() 或手动解析 QueryDict 键名
CSRF DRF API 视图默认豁免 CSRF(推荐);若用普通 View,需加 @csrf_exempt 忘记处理 CSRF 导致 403 错误
调试技巧 前端 console.log(JSON.stringify(payload));后端 print(type(request.data), request.data) 仅依赖 console.log(details) 而忽略网络面板实际请求体

遵循以上方案,即可稳定、清晰地在 Django 中接收并处理前端传来的任意深度 JSON 数组,为构建商品管理、表单动态字段、多步骤配置等复杂业务打下坚实基础。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

django axios 前端 json数组

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6090

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5446

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5023

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5618

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

803

5

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 6.1 官方文档
Django 6.1 官方文档

共0课时 | 0人学习

Django 教程
Django 教程

共28课时 | 9.8万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 2万人学习