Django Admin中增加导出Excel功能过程解析


Posted in Python onSeptember 04, 2019

在使用Django Admin时, 对于列表我们有时需要提供数据导出功能, 如下图:

增加导出Excel功能

Django Admin中增加导出Excel功能过程解析

在Django Admin中每个模型的Admin类(继承至admin.ModelAdmin), 我们可以通过actions增加支持的动作, 值为当前类存在的方法名, 例如:

.......
@admin.register(Issue)
class IssueAdmin(admin.ModelAdmin):
  ......
  actions = ['export_as_excel'] # 增加动作, 对应相应的方法名
  def export_as_csv(self, request, queryset): # 具体的导出csv方法的实现
    pass  
  export_as_excel.short_description = '导出Excel' # 该动作在admin中的显示文字

导出Excel方法详细实现如下:

from openpyxl import Workbook
....
  def export_as_excel(self, request, queryset):
    meta = self.model._meta # 用于定义文件名, 格式为: app名.模型类名
    field_names = [field.name for field in meta.fields] # 模型所有字段名

    response = HttpResponse(content_type='application/msexcel') # 定义响应内容类型
    response['Content-Disposition'] = f'attachment; filename={meta}.xlsx' # 定义响应数据格式
    wb = Workbook() # 新建Workbook
    ws = wb.active # 使用当前活动的Sheet表
    ws.append(field_names) # 将模型字段名作为标题写入第一行
    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) # 将数据存入响应内容
    return response

由于导出Excel动作可以作为各个模型的通用动作, 我们可以封装成一个Mixin类使用, 完整代码如下:

from openpyxl import Workbook
from django.contrib import admin
from django.http import HttpResponse
from .models import Issue
class ExportExcelMixin(object):
  def export_as_excel(self, request, queryset):
    meta = self.model._meta
    field_names = [field.name for field in meta.fields]
    response = HttpResponse(content_type='application/msexcel')
    response['Content-Disposition'] = f'attachment; filename={meta}.xlsx'
    wb = Workbook()
    ws = wb.active
    ws.append(field_names)
    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)
    return response
  export_as_excel.short_description = '导出Excel'
@admin.register(Issue)
class IssueAdmin(admin.ModelAdmin, ExportCsvMixin):
  fields = ('key', 'summary', 'status', 'project',
       'origin', 'components', 'prj_level', 'prj_category',
       'assignee', 'origin_person', 'pm', 'dev_manager', 'test_manager', 'tester', 'fe_dev', 'backend_dev',
       'plan_begin', 'plan_end', 'fe_plan_begin', 'fe_plan_end', 'test_plan_begin',
       'test_plan_end', 'backend_plan_begin', 'backend_plan_end',
       'created', 'reopen', 'prd_begin', 'prd_end', 'dev_begin', 'dev_end',
       'test_begin', 'test_end', 'pm_check', 'ready', 'pause', 'done',
       'pm_take', 'dev_take', 'test_take', 'total_take',
       'tags',
       )
  readonly_fields = fields
  list_display = ('key', 'summary', 'status', 'origin', 'components', 'created', 'visit')
  list_filter = ('origin', 'components', 'status', 'tags')
  search_fields = ('key', 'summary')
  date_hierarchy = 'created'
  actions = ['export_as_excel']

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的函数用法入门教程
Sep 02 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
numpy.linspace函数具体使用详解
May 27 Python
python网络应用开发知识点浅析
May 28 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
使用Python获取当前工作目录和执行命令的位置
Mar 09 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
通过实例了解python__slots__使用方法
Sep 14 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
Python 2.6.6升级到Python2.7.15的详细步骤
Dec 14 Python
python中的getter与setter你了解吗
Mar 24 Python
Django Admin中增加导出CSV功能过程解析
Sep 04 #Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 #Python
通过Python编写一个简单登录功能过程解析
Sep 04 #Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 #Python
python3实现微型的web服务器
Sep 03 #Python
Python面向对象之Web静态服务器
Sep 03 #Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 #Python
You might like
PHP 全角转半角实现代码
2010/05/16 PHP
php实现的日历程序
2015/06/18 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
php跨域调用json的例子
2013/11/13 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
React组件的三种写法总结
2017/01/12 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
keep-alive保持组件状态的方法
2020/12/02 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
python实现邮件发送功能
2019/08/10 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Python用Jira库来操作Jira
2020/12/28 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
教师党员思想汇报
2014/01/06 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
青年文明号汇报材料
2014/12/23 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis