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

Django视图返回JsonResponse时如何实现JSON内容下载为.json文件

实现方案说明

方案1:后端直接触发下载(无需额外点击,推荐)

直接修改Django视图的返回逻辑,给响应添加下载头,用户提交表单后浏览器会自动触发JSON文件下载,不需要额外使用DOWNLOAD按钮:

import json
from django.http import HttpResponse

# 你原来构造nested_data的逻辑保持不变
nested_data = {
    'name': cleaned_data3['theme_name'],
    'visualStyles': {
        'barChart': {
            '*': {
                'general': [{
                    'responsive': cleaned_data2['responsive'],
                    'keepLayerOrder': cleaned_data2['maintain_layer_order']
                }],
                'legend': [{
                    'show': cleaned_data['show'],
                    'position': cleaned_data['position'],
                    'showTitle': cleaned_data['show_title'],
                    'labelColor': {
                        'solid': {
                            'color': '#666666'
                        }
                    },
                    'fontFamily': cleaned_data['font'],
                    'fontSize': cleaned_data['font_size']
                }],
            }
        }
    }
}

# 构造带下载头的响应
response = HttpResponse(
    json.dumps(nested_data, ensure_ascii=False, indent=2),
    content_type='application/json'
)
# 配置下载的文件名
response['Content-Disposition'] = 'attachment; filename="theme_config.json"'
return response

方案2:保留「提交后手动点击DOWNLOAD下载」的交互

如果你需要用户提交后先预览结果,再手动点击按钮下载,确实需要给a标签的href属性赋值,具体实现如下:

后端逻辑

保持你现有的JsonResponse(nested_data)返回逻辑不变即可。

前端逻辑

将表单改为异步提交,拿到返回的JSON数据后生成临时Blob链接,赋值给a标签的href属性:

// 记得给你的表单加个id比如id="configForm"
document.querySelector('#configForm').addEventListener('submit', async function(e) {
    // 阻止默认表单提交跳转
    e.preventDefault();
    const formData = new FormData(this);
    // 发送异步POST请求,注意补充CSRF Token
    const res = await fetch('/你的接口地址/', {
        method: 'POST',
        body: formData,
        headers: {
            'X-CSRFToken': document.querySelector('[name="csrfmiddlewaretoken"]').value
        }
    });
    const jsonData = await res.json();
    // 生成Blob临时链接
    const blob = new Blob([JSON.stringify(jsonData, null, 2)], {type: 'application/json'});
    const tempUrl = URL.createObjectURL(blob);
    // 赋值给a标签
    const downloadBtn = document.querySelector('a[download]');
    downloadBtn.href = tempUrl;
    // 可自定义文件名,比如用返回的name字段当文件名
    downloadBtn.download = `${jsonData.name || 'config'}.json`;
})

注:如果不需要用户手动点击,也可以在拿到tempUrl后直接调用downloadBtn.click()自动触发下载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:24:04