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利用pyHook实现监听用户鼠标与键盘事件
Aug 21 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
Python基于unittest实现测试用例执行
Nov 25 Python
用python对oracle进行简单性能测试
Dec 05 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
Python实现拼音转换
Jun 07 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中实现记住密码自动登录的代码
2011/03/02 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
PHP数组相关函数汇总
2015/03/24 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
JavaScript 数组循环引起的思考
2010/01/01 Javascript
js prototype截取字符串函数
2010/04/01 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
使用vue如何构建一个自动建站项目
2018/02/05 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Python2中文处理纪要的实现方法
2018/03/10 Python
python制作填词游戏步骤详解
2019/05/05 Python
Python转换时间的图文方法
2019/07/01 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
纯css3使用vw和vh实现自适应的方法
2018/02/09 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
捷克购买家具网站:JENA nábytek
2020/03/19 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
节能环保口号
2014/06/12 职场文书
增员口号大全
2014/06/18 职场文书
七年级思品教学反思
2016/02/20 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android