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中itertools模块用法详解
Sep 25 Python
Python中使用摄像头实现简单的延时摄影技术
Mar 27 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
python爬虫简单的添加代理进行访问的实现代码
Apr 04 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
vscode调试django项目的方法
Aug 06 Python
Python 多线程之threading 模块的使用
Apr 14 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
Session保存到数据库的php类分享
2011/10/24 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
JQuery调webservice实现邮箱验证(检测是否可用)
2013/05/21 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
node.js中的http.get方法使用说明
2014/12/14 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
jQuery实现用户信息表格的添加和删除功能
2017/09/12 jQuery
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
原生js实现分页效果
2020/09/23 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
python分析作业提交情况
2017/11/22 Python
numpy中索引和切片详解
2017/12/15 Python
Python最小二乘法矩阵
2019/01/02 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python如何执行系统命令
2020/09/23 Python
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
大学生求职中的自我评价
2013/10/01 职场文书
小学生考试获奖感言
2014/01/30 职场文书
婚庆司仪主持词
2014/03/15 职场文书
大学生党员承诺书
2014/05/20 职场文书
一份文言文检讨书
2014/09/13 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
python实现A*寻路算法
2021/06/13 Python
基于Go语言构建RESTful API服务
2021/07/25 Golang