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爬虫入门教程之糗百图片爬虫代码分享
Sep 02 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
numpy添加新的维度:newaxis的方法
Aug 02 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python实现字符串加密 生成唯一固定长度字符串
Mar 22 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
python创建学生管理系统
Nov 22 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
Python Unittest原理及基本使用方法
Nov 06 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/02/24 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
JavaScript实现邮箱地址自动匹配功能代码
2016/11/28 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
Bootstrap实现可折叠分组侧边导航菜单
2018/03/07 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
jQuery实现日历效果
2020/09/11 jQuery
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
用Python进行websocket接口测试
2020/10/16 Python
AP澳洲中文网:澳洲正品直邮,包税收件无忧
2019/07/12 全球购物
高中生学习总结的自我评价范文
2013/10/13 职场文书
关于赌博的检讨书
2014/01/24 职场文书
环保建议书500字
2014/05/14 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书