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中的25个隐藏特性
Mar 30 Python
python执行使用shell命令方法分享
Nov 08 Python
python实现二叉树的遍历
Dec 11 Python
Python入门之后再看点什么好?
Mar 05 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
深入浅析Python 中 is 语法带来的误解
May 07 Python
python进程和线程用法知识点总结
May 28 Python
python hash每次调用结果不同的原因
Nov 21 Python
python将unicode和str互相转化的实现
May 11 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 Python
Python编写冷笑话生成器
Apr 20 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
详解:――如何将图片储存在数据库里
2006/12/05 PHP
zend optimizer在wamp的基础上安装图文教程
2013/10/26 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
javascript定义函数的方法
2010/12/06 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
vue滚动tab跟随切换效果
2020/06/29 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
Python显示进度条的方法
2014/09/20 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
财务会计大学生自我评价
2014/04/09 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
公安学专业求职信
2014/07/27 职场文书
会计试用期自我评价
2014/09/19 职场文书
给校长的一封检讨书
2014/09/20 职场文书
歌舞青春观后感
2015/06/10 职场文书
培训计划通知
2015/07/15 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS