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序列之list和tuple常用方法以及注意事项
Jan 09 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
python对json的相关操作实例详解
Jan 04 Python
python如何获取服务器硬件信息
May 11 Python
Python实现读取并保存文件的类
May 11 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
500行Python代码打造刷脸考勤系统
Jun 03 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 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
laravel 使用auth编写登录的方法
2019/09/30 PHP
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
js回文数的4种判断方法示例
2019/06/04 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
python日志记录模块实例及改进
2017/02/12 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python unittest模块用法实例分析
2018/05/25 Python
Flask框架信号用法实例分析
2018/07/24 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Spy++的使用方法及下载教程
2021/01/29 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
英国复古皮包品牌:Beara Beara
2018/07/18 全球购物
MySQL面试题目集锦
2016/04/14 面试题
经理职责范文
2013/11/08 职场文书
《日月潭》教学反思
2014/02/28 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
教师师德考核自我评价
2014/09/13 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
Flink 侧流输出源码示例解析
2022/09/23 Servers