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 MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
Python装饰器语法糖
Jan 02 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
django和vue实现数据交互的方法
Aug 21 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Python读取表格类型文件代码实例
Feb 17 Python
Django设置Postgresql的操作
May 14 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
自定义右键属性覆盖浏览器默认右键行为实现代码
2013/02/02 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
Vue中使用clipboard实现复制功能
2018/09/05 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vant实现购物车功能
2020/06/29 Javascript
[00:34]TI7不朽珍藏III——地穴编织者不朽展示
2017/07/15 DOTA
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
利用Python批量生成任意尺寸的图片
2016/08/29 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python连接数据库的方法
2017/10/19 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
对Python中class和instance以及self的用法详解
2019/06/26 Python
浅谈python3中input输入的使用
2019/08/02 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
调查研究项目计划书
2014/04/29 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
使用Django框架创建项目
2022/06/10 Python