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

如何将Django视图返回的值传递到Ajax的success回调函数中

问题排查与修复方案

你的代码存在视图层、前端逻辑两部分问题,具体修改方案如下:

核心问题说明

  • 视图逻辑缺陷:没有处理表单验证失败的分支,未定义cols变量就直接返回,会触发服务端报错;同时直接用HttpResponse返回列表数据,Django会将其转为普通字符串,前端无法直接解析为可遍历的数组
  • 前端逻辑缺失:没有指定Ajax返回数据的解析格式,也没有编写DOM渲染逻辑,拿到数据后无法展示到模板页面

修复后的代码

视图层代码

from django.http import JsonResponse

def handle_new_file(request):
    if request.method == 'POST':
        form = NewFileForm(request.POST, request.FILES)
        if form.is_valid():
            csv_file = request.FILES['csv_file']
            fs = FileSystemStorage()
            file_name = fs.save(csv_file.name, csv_file)
            file_url = f"./media/file_uploads/{file_name}"
            cols = get_column_names(file_url)
            form.save()
            # 返回结构化JSON数据
            return JsonResponse({"status": "success", "columns": cols})
        # 表单验证失败的兜底返回
        return JsonResponse({"status": "error", "msg": "表单验证失败"}, status=400)
    # 非POST请求的兜底返回
    return JsonResponse({"status": "error", "msg": "请求方式不合法"}, status=405)

前端Ajax代码

function upload(event) {
    event.preventDefault();
    var data = new FormData($('form').get(0));

    $.ajax({
        url: $(this).attr('action'),
        type: $(this).attr('method'),
        data: data,
        cache: false,
        processData: false,
        contentType: false,
        dataType: 'json', // 指定返回数据为JSON格式,自动解析
        success: function (res) {
            if(res.status === 'success') {
                // 渲染列名到模板,提前在模板中添加id为column-container的DOM容器即可
                let columnHtml = '<p>CSV文件列名如下:</p><ul>';
                res.columns.forEach(col => {
                    columnHtml += `<li>${col}</li>`;
                });
                columnHtml += '</ul>';
                $('#column-container').html(columnHtml);
            } else {
                alert('操作失败:' + res.msg);
            }
        },
        error: function() {
            alert('网络请求异常,请重试');
        }
    });
    return false;
}

$(function () {
    $('#new_form').submit(upload);
});

额外注意事项

  • 模板中提前添加用于展示列名的容器,示例:<div id="column-container"></div>
  • 确保get_column_names函数返回的是标准列表类型,不要返回不可序列化的对象
  • Django开启CSRF防护的情况下,表单内需添加{% csrf_token %}标签,FormData会自动携带该字段完成校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:36:01