在Django中有时候需要在后台界面需要用到导出数据的功能,对于功能要求比较高的可以直接使用Import_Export库来完成。但是对于一些简单的数据导出,可以直接自定义一些简单的函数来实现导出数据。

经过测试,有以下两种方法可以使用:HttpResponse 和  FileResponse 两种方法。

一、HttpResponse:

首先引入 from django.http import HttpResponse

添加导出动作:

actions = ['export_excel']

完整代码1:

# 导出数据到EXCEL文件def export_excel(self, request, queryset):meta = self.model._meta# field_names = [field.name for field in meta.fields]# 如果直接按照数据库字段进行导出,直接使用上面的代码,如果需要进行部分字段的筛选,同时为导出的文件添加中文表头,可以使用下面的代码cn_name = ['区域', 'A库存数','A库存金额', 'B库存数', 'B库存金额', 'C库存数', 'C库存金额', '库存日期', '备注信息']field_names = ['quyu', 'Akcs', 'Akcj', 'Bkcs', 'Bkcj', 'Ckcs','Ckcj','kc_date', 'note']today_time = time.strftime('%Y%m%d%H%M%S', time.localtime()) filename = f'{str(meta)[7:]}' + '_' + f'{today_time}'response = HttpResponse(content_type='application/msexcel')response['Content-Disposition'] = f'attachment; filename={filename}.xlsx'wb = Workbook()ws = wb.active# ws.append(field_names)ws.append(cn_name)  # 写入中文表头for obj in queryset:for field in field_names:data = [f'{getattr(obj, field)}' for field in field_names]row = ws.append(data)wb.save(response)self.message_user(request, f"{request.user.username}导出库存数据<{filename}.xlsx>")return responseexport_excel.short_description = '下载数据'export_excel.type = 'info'export_excel.confirm = '确认即将开始导出差异数据!'

相关说明:

1、field_names = [field.name for field in meta.fields];

field_names 如果使用这个代码,是直接使用的数据库的全部字段;

field_names = [   ] 这个是在全部字段的基础上进行的筛选,只保留部分需要导出的字段,可以减小导出数据的体积;

2、表头的写入:

ws.append(field_names) —— 这行代码值直接写入数据库字段定义的名称作为表头;虽然非中文不利于阅读,但是这种方式生成的文件适合作为数据库导入数据时的模板;

ws.append(cn_name)  # 写入中文表头,方便阅读;但不适合作为数据导入模板;

3、filename的定义:

在定义filename的时候,加入了today_time的定义,而且将today_time定义到'%Y%m%d%H%M%S',是方便区分文件,便面固定文件名称在第二次导出的时候造成文件覆盖;同时还可以作为时间戳标记;

二、FileResponse:

首先导入:from django.http import FileResponse

添加动作:actions = ['export_excel','export_csv']

完整代码2:

def export_csv(self, request, queryset):today_time = time.strftime('%Y%m%d%H%M%S', time.localtime()) filename =  '/logs/' + 'myform_' + f'{today_time}.csv'ids = list(queryset.values_list('quyu', 'wxkcs', 'wxkcj', 'dlkcs', 'dlkcj', 'zykcs','zykcj','note'))print(ids,type(ids))biaotou = '区域,A库存数,A库存金额,B库存数,B库存金额,C数量,C金额,备注\n'  with open(filename, 'a+') as f:f.write(biaotou)  for i in ids:f.write(str(i)[1:-3]+'\n')        newname = f'kucun' + '_' + f'{today_time}.csv'response = FileResponse(open(filename, "rb"))response['Content-Type'] = 'application/octet-stream'response['Content-Disposition'] = f'attachment; filename={newname}'self.message_user(request, f"{request.user.username}导出库存数据<{newname}")return responseexport_csv.short_description = '下载数据CSV'export_csv.type = 'info'export_csv.confirm = '确认即将开始导出差异数据!'

相关说明:

1、导出文件的格式:

格式并不固定,可以是csv\txt\log等多种格式,这里选择csv是因为处理数据比较方便;

2、为什么非要保存为一个独立的文件?

这个地方原本是另外一个很复杂的函数,通过数据整合成为有固定格式的word文档,当然也可以是PDF文档;然后下载的是一个格式排版都比较精美的文档;为了简化代码,使主函数功能更清晰,这里就使用csv文件做简单的说明;

3、表头的汉字说明:

为了能使导出的数据更清晰,便于阅读,特意添加了一行中文的表头;

其他的内容都比较简单、清晰,可以结合第一种方法看一下。

这两种方法都可以实现简单的数据导出、下载功能;各有一定的作用。也可以在下载的同时,将文件同时保存在服务器以便备查;配合一些日志记录。

Django 后台admin管理页面添加简易导出/下载数据功能的两种方法相关推荐

  1. vue 实现前端excel导出表格携带token的两种方法

    场景一:后端返回一个api接口,直接点击按钮就能下载Excel文件时: (1)不需要携带token <!-- 注:excelUrl绑定的是后端返回的api接口 --> <el-lin ...

  2. 前端从后端导出excel表格文件的两种方法

    大部分前端开发人员在做项目的过程中应该都遇到过这个问题: 在前端点击一个导出或者下载的按钮,从后端导出包含列表中的数据的excel文件. 那么如何实现呢? 方法一: 如果项目中没有涉及要要权限验证的问 ...

  3. 简易的js获取星期几的两种方法

    第一种: var a = ["日", "一", "二", "三", "四", "五&quo ...

  4. ppt模板怎样用到html中,如何添加套用 PPT 模板?教你两种方法

    如果你想要提升幻灯片的质量,需要注意的细节有很多,除了进行图文排版,还可以套用PPT模板,这样就不用思考划分标题栏.内容区域,可以节省时间.现在问题来了,如何导入PPT模板?很简单,大家可以试试下面两 ...

  5. c#+AE将要素类导出为shapefile文件(两种方法)

    方法一:使用IFeatureDataConverter.ConvertFeatureClass方法 private int ExportToShapefile(IFeatureClass pFeatu ...

  6. arcmap shp导出cad无反应_CAD与GIS互转的两种方法

    2019年自然资源部18号文的颁布预示着国土空间规划时代的到来,国土空间规划融合了城乡规划.土地利用规划.主体功能区划等空间规划,因此,国土空间规划的编制需要原城乡规划.原土地利用规划等多专业人员的参 ...

  7. Django后台admin的使用

    Django后台admin的使用 1.简述 2.创建数据库表 3.修改admin.py文件 4.启动服务,进入界面 5.自定义表显示内容: 6.自定义动作 1.简述 Django的admin可以提供一 ...

  8. 解决博易博客后台文章管理页面无法显示分页的问题

    升级blogyi2.0以后我发现文章管理页面找不到分页的功能,于是我换了几个浏览器查看了一下,火狐或谷歌浏览器可以看到分页功能的.这很明显是后台css样式的问题.通过谷歌浏览器测试了一下,找到了分页功 ...

  9. Python全栈(八)Flask项目实战之10.前台发布帖子和后台帖子管理页面搭建

    文章目录 一.前台板块页面搭建 二.发布帖子页面搭建 三.前台帖子模型创建 四.文章的发布 1.基本实现 2.项目优化 (1)功能优化--Markdown编辑上传上传本地图片 (2)代码优化--抽离A ...

最新文章

  1. 动态规划-最优二叉查找树
  2. 「APIO2018」选圆圈
  3. python的print换行
  4. JavaScript对象理解
  5. python3使用SQLALchemy报错No module named ‘MySQLdb‘
  6. Rancher添加主机docker命令
  7. Linux常用命令和服务器配置
  8. Linux 中 ss 命令的使用实例介绍
  9. linux目录结构与功能_深入理解linux系统的目录结构(总结的非常详细)
  10. 为什么数据可视化很重要
  11. c编程语言学习软件,用什么软件学习c语言
  12. POJ - 1179
  13. 21碳纤维山地车哪个牌子好全球最贵辐轮王土拨鼠自行车965万
  14. 基于计算机显卡的研究
  15. 64位处理器_为什么苹果A处理器领先安卓2年?从什么时候开始领先的?有何依据...
  16. 五 IP核行业潜在投资方向和机会
  17. 内存占用率过高怎么办 一分钟解决
  18. 11届蓝桥杯青少年组C++全国赛高级组
  19. benchmark TPC-H postgreSQL
  20. Redis设计与实现-笔记(一)

热门文章

  1. Beta阶段基于NABCD评论作品
  2. W7 关闭 ss 无法上网 解决方法
  3. 用JSP/Servlet构建三层式管理信息系统
  4. 达达-京东到家面试总结
  5. 华为运营商级路由器配置示例 | IPv4静态路由
  6. 阿里云服务器安装postgresql
  7. 给Excel表格中某一列都添加指定内容
  8. 萤石网络摄像机 服务器压力,萤石C3W监控摄像头真的很不堪吗,不想被骗看下这里...
  9. 龙蜥社区技术委员会主席杨勇:下一代操作系统展望
  10. sqlserver2008 R2数据库-不允许表修改保存,阻止保存要求重新创建表的更改