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 相关文章推荐
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
Django实现列表页商品数据返回教程
Apr 03 Python
django中嵌套的try-except实例
May 21 Python
详解pycharm2020.1.1专业版安装指南(推荐)
Aug 07 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 Python
Python数据分析入门之数据读取与存储
May 13 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
js添加table的行和列 具体实现方法
2013/07/22 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
Vue自定义事件(详解)
2017/08/19 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python各种语言间时间的转化实现代码
2016/03/23 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python打包exe开机自动启动的实例(windows)
2019/06/28 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
python实现取余操作的简单实例
2020/08/16 Python
经典促销广告词大全
2014/03/19 职场文书
工商干部先进事迹
2014/05/14 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
医院我们的节日活动实施方案
2014/08/22 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2014年度个人工作总结
2014/11/07 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis