使用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
相关产品推荐
相关产品推荐

