Django Admin中增加导出CSV功能过程解析


Posted in Python onSeptember 04, 2019

参考 https://books.agiliq.com/projects/django-admin-cookbook/en/latest/export.html

在使用Django Admin时, 对于列表我们有时需要提供数据导出功能, 如下图:

增加导出CSV功能

Django Admin中增加导出CSV功能过程解析

在Django Admin中每个模型的Admin类(继承至admin.ModelAdmin), 我们可以通过actions增加支持的动作, 值为当前类存在的方法名, 例如:

.......
@admin.register(Issue)
class IssueAdmin(admin.ModelAdmin):
  ......
  actions = ['export_as_csv'] # 增加动作, 对应相应的方法名
  def export_as_csv(self, request, queryset): # 具体的导出csv方法的实现
    pass
  export_as_csv.short_description = '导出CSV' # 该动作在admin中的显示文字

导出CSV方法详细实现如下:

def export_as_csv(self, request, queryset):
    meta = self.model._meta # 用于确定导出的文件名, 格式为: app名.模型类名
    field_names = [field.name for field in meta.fields] # 所有属性名

    response = HttpResponse(content_type='text/csv')  # 指定响应内容类型
    response['Content-Disposition'] = f'attachment; filename={meta}.csv'
    response.charset = 'utf-8-sig' # 可选, 修改编码为带BOM的utf-8格式(Excel打开不会有乱码)
    writer = csv.writer(response)
    writer.writerow(field_names) # 将属性名写入csv
    for obj in queryset: # 遍历要导出的对象列表
      row = writer.writerow([getattr(obj, field) for field in field_names]) # 将当前对象的各属性值写入csv
    return response

由于导出CSV动作可以作为各个模型的通用动作, 我们可以封装成一个Mixin类使用, 完整代码如下:

import csv
from django.contrib import admin
from django.http import HttpResponse
from .models import Issue
class ExportCsvMixin(object):
  def export_as_csv(self, request, queryset):
    meta = self.model._meta
    field_names = [field.name for field in meta.fields]
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = f'attachment; filename={meta}.csv'
    response.charset = 'utf-8-sig'
    writer = csv.writer(response)
    writer.writerow(field_names)
    for obj in queryset:
      row = writer.writerow([getattr(obj, field) for field in field_names])
    return response
  export_as_csv.short_description = '导出CSV'
@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_csv']

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 自动安装 Rising 杀毒软件
Apr 24 Python
python实现超简单端口转发的方法
Mar 13 Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python探索之修改Python搜索路径
Oct 25 Python
python实现抖音视频批量下载
Jun 20 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
python实现连连看辅助(图像识别)
Mar 25 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
利用python实现AR教程
Nov 20 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
python机器学习库xgboost的使用
Jan 20 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
Django中间件拦截未登录url实例详解
Sep 03 #Python
You might like
php下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
初识Laravel
2014/10/30 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
使用JS获取当前地理位置方法汇总
2014/12/18 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
2016/11/04 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
node 版本切换的实现
2020/02/02 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Django的models模型的具体使用
2019/07/15 Python
Pytorch转tflite方式
2020/05/25 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
计算机科学与技术应届生求职信
2013/11/07 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
儿园租房协议书范本
2014/12/02 职场文书
技术负责人岗位职责
2015/02/10 职场文书
个人党性分析总结
2015/03/05 职场文书
2015年父亲节寄语
2015/03/23 职场文书
2016公司新年问候语
2015/11/11 职场文书
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis