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基础教程之自定义函数介绍
Aug 29 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
Python随机生成数模块random使用实例
Apr 13 Python
Python中的rfind()方法使用详解
May 19 Python
django批量导入xml数据
Oct 16 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
如何通过雪花算法用Python实现一个简单的发号器
Jul 03 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
python中for in的用法详解
Apr 17 Python
Python datetime 如何处理时区信息
Sep 02 Python
python实现暗通道去雾算法的示例
Sep 27 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
使用php实现截取指定长度
2013/08/06 PHP
php中autoload的用法总结
2013/11/08 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
JavaScript修改css样式style
2008/04/15 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
js中document.write的那点事
2014/12/12 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
js判断是否是手机页面
2017/03/17 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
详解vuex的简单使用
2018/03/12 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
Django框架中render_to_response()函数的使用方法
2015/07/16 Python
python中os模块详解
2016/10/14 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
售房协议书
2014/08/19 职场文书
贷款承诺书
2015/01/20 职场文书
护理专业自荐信范文
2015/03/06 职场文书
养成教育工作总结
2015/08/13 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js