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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
python实现的简单文本类游戏实例
Apr 28 Python
Python中列表的一些基本操作知识汇总
May 20 Python
Python读写ini文件的方法
May 28 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
关于Python-faker的函数效果一览
Nov 28 Python
基于python监控程序是否关闭
Jan 14 Python
简单了解如何封装自己的Python包
Jul 08 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 Python
Python批量解压&压缩文件夹的示例代码
Apr 04 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递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
vue vue-Router默认hash模式修改为history需要做的修改详解
2018/09/13 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
Python列表与元组的异同详解
2019/07/02 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
美国最顶级的精品店之一:Hampden Clothing
2016/12/22 全球购物
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
大学生就业自荐信
2013/10/26 职场文书
大学生年度自我鉴定
2013/10/31 职场文书
员工入职担保书范文
2014/04/01 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
公司内部升职自荐信
2015/03/27 职场文书
罚款通知怎么写
2015/04/22 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
JavaScript中isPrototypeOf函数
2021/11/07 Javascript
一文简单了解MySQL前缀索引
2022/04/03 MySQL