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 相关文章推荐
详解C++编程中一元运算符的重载
Jan 19 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
简单介绍django提供的加密算法
Dec 18 Python
Django 限制访问频率的思路详解
Dec 24 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 Python
基于python实现操作redis及消息队列
Aug 27 Python
解决Pytorch半精度浮点型网络训练的问题
May 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下实现农历日历的代码
2007/03/07 PHP
PHP学习之整理字符串
2011/04/17 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
微信小程序云开发之新手环境配置
2019/05/16 Javascript
利用原生JS实现欢乐水果机小游戏
2020/04/23 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
python实现telnet客户端的方法
2015/04/15 Python
python使用fork实现守护进程的方法
2017/11/16 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
幼儿园托班开学寄语
2014/01/18 职场文书
高中数学教学反思
2014/01/30 职场文书
商场消防演习方案
2014/02/12 职场文书
市政管理求职信范文
2014/05/07 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
工地宣传标语
2014/06/18 职场文书
酒店工程部岗位职责
2015/02/12 职场文书
土建技术员岗位职责
2015/04/11 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
mysql的单列多值存储实例详解
2022/04/05 MySQL