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

在Django视图函数中正确获取JS通过AJAX传递的数组数据问题

在Django视图中正确获取AJAX传递的数组数据

嘿,这是jQuery AJAX传数组到Django时的典型坑,我来帮你搞定它!

问题根源

当你直接用jQuery传递数组类型的参数时,jQuery会自动把参数名转换成date[]、price[]这种带方括号的格式(从你看到的原始POST数据就能验证这一点)。但Django的request.POST.get()方法只能获取该键对应的单个值,所以要么拿到设置的默认值false(找不到匹配键时),要么只能拿到数组的最后一个元素。

解决方法一:用request.POST.getlist()(最简单)

Django专门提供了getlist()方法来处理同一个键对应多个值的场景,完美适配这种数组传递需求。直接修改你的视图代码即可:

expirationdate = request.POST.getlist('date[]')
price = request.POST.getlist('price[]')
print(expirationdate)  # 输出完整数组,比如 ['2021-05-06', '2021-06-07']
print(price)           # 同理,拿到完整的价格数组

这个方法不需要改动前端代码,仅后端调整就能生效,适合简单的数组传递需求。

解决方法二:用JSON格式传递数据(更灵活)

如果你的数据结构比较复杂(比如嵌套数组、多层对象),推荐用JSON格式传递,这样前后端的数据结构能完全对应:

前端修改AJAX代码:

var pricesum = sumprice;
var date = expirationdates;
var price = prices;
$.ajax({
    type: "POST",
    url: "print",
    contentType: "application/json",  // 告诉后端我们发送的是JSON数据
    data: JSON.stringify({
        'pricesum': pricesum,
        'date': date,
        'price': price,
    }),
    // 别忘了加上CSRF令牌,否则Django会拒绝请求
    headers: {
        "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value
    }
});

后端视图解析JSON:

import json
from django.http import JsonResponse

def print_view(request):
    if request.method == 'POST':
        # 解析请求体中的JSON数据
        data = json.loads(request.body)
        expirationdate = data.get('date', [])
        price = data.get('price', [])
        pricesum = data.get('pricesum', 0)
        
        print(expirationdate)
        print(price)
        
        # 处理完成后可以返回响应
        return JsonResponse({'status': 'success'})

这种方法的优势是数据结构更清晰,不管是数组还是复杂对象都能完美传递,适合中大型项目的场景。

额外小提醒

别忘了Django的POST请求需要CSRF令牌验证!如果你的前端代码里没加,会收到403错误。上面的JSON方法里已经加了获取令牌的代码,如果你用第一种方法,也可以在AJAX里加上:

headers: {
    "X-CSRFToken": document.querySelector('[name=csrfmiddlewaretoken]').value
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:07:49