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 相关文章推荐
操作Windows注册表的简单的Python程序制作教程
Apr 07 Python
Python实现自动上京东抢手机
Feb 06 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
matplotlib实现区域颜色填充
Mar 18 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
python/golang实现循环链表的示例代码
Sep 14 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
Pytest中conftest.py的用法
Jun 27 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
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
bootstrapvalidator之API学习教程
2017/06/29 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
JS 验证码功能的三种实现方式
2018/11/26 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
使用layui监听器监听select下拉框,事件绑定不成功的解决方法
2019/09/28 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
个人社会实践自我鉴定
2014/03/24 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
2014小学语文教师个人工作总结
2014/12/03 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
大学生学期个人总结
2015/02/12 职场文书
公司人事管理制度
2015/08/05 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
Python中的程序流程控制语句
2022/02/24 Python