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

使用Python Django导出模型数据到CSV文件无法触发下载问题

核心问题

你使用AJAX发起文件导出请求时,浏览器不会自动将响应的文件流触发为下载行为,AJAX仅会将返回的CSV数据作为普通响应内容交给JS处理,所以不会弹出下载窗口。

解决方案

方案1:直接跳转导出URL(最简推荐)

导出是GET请求,无需使用AJAX,直接修改JS代码跳转即可触发浏览器下载逻辑,同时GET请求不需要传递CSRF Token:

// ======================
//  Export Function
// ======================
function exportData(e) {
  window.location.href = "/magic/sets/" + setCode + "/export-data/?product-type=" + product_type;
};

方案2:保留AJAX请求,手动触发下载

如果业务需要必须使用AJAX,可在请求成功后手动处理返回的文件流,动态生成下载链接触发点击:

// ======================
//  Export Function
// ======================
function exportData(e) {
  $.ajax({
    url: "/magic/sets/" + setCode + "/export-data/?product-type=" + product_type,
    type: "GET",
    xhrFields: {
      responseType: 'blob' // 指定返回类型为二进制流
    },
    success: function (data, status, xhr) {
      // 从响应头提取文件名,也可以自定义
      const contentDisposition = xhr.getResponseHeader('Content-Disposition');
      const fileName = contentDisposition.match(/filename=(.*)/)[1];
      // 生成临时下载链接
      const blob = new Blob([data], { type: 'text/csv' });
      const downloadUrl = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = downloadUrl;
      a.download = fileName;
      document.body.appendChild(a);
      a.click();
      // 释放内存
      document.body.removeChild(a);
      URL.revokeObjectURL(downloadUrl);
    }
  });
};
后端优化建议

为了避免文件名包含特殊字符、中文时出现乱码,可修改Django响应头的文件名配置:
首先导入工具类:

from django.utils.http import urlquote

修改Content-Disposition配置:

filename = f"ExportData-{setCode.upper()}-{now.strftime('%Y-%m-%d %H.%M.%S')}.csv"
response['Content-Disposition'] = f"attachment;filename*=UTF-8''{urlquote(filename)}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:24:05