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之编写类之二方法
Oct 11 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python web基础之加载静态文件实例
Mar 20 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
Python XlsxWriter模块Chart类用法实例分析
Mar 11 Python
python3实现表白神器
Apr 09 Python
django 中QuerySet特性功能详解
Jul 25 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
改写函数实现PHP二维/三维数组转字符串
2013/09/13 PHP
PHP实现webshell扫描文件木马的方法
2017/07/31 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
2015/07/15 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
javascript表达式和运算符详解
2017/02/07 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
详解使用webpack+electron+reactJs开发windows桌面应用
2019/02/01 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
js实现坦克移动小游戏
2019/10/28 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
TensorFlow实现Logistic回归
2018/09/07 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
基于Django实现日志记录报错信息
2019/12/17 Python
冰淇淋店创业计划书范文
2013/12/27 职场文书
好家长事迹材料
2014/01/23 职场文书
料理师求职信
2014/01/30 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
英文演讲稿开场白
2014/08/25 职场文书
意向协议书
2015/01/27 职场文书
鲁冰花观后感
2015/06/10 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
Python pandas求方差和标准差的方法实例
2021/08/04 Python
Go语言读取txt文档的操作方法
2022/01/22 Golang