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检测字符串中是否包含某字符集合中的字符
May 21 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
python select.select模块通信全过程解析
Sep 20 Python
基于python requests库中的代理实例讲解
May 07 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
Jun 27 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
python os模块简单应用示例
May 23 Python
Python 实现还原已撤回的微信消息
Jun 18 Python
Python实现CNN的多通道输入实例
Jan 17 Python
Python中Selenium模块的使用详解
Oct 09 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
Jan 05 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
php实现rc4加密算法代码
2012/04/25 PHP
php牛逼的面试题分享
2013/01/18 PHP
php权重计算方法代码分享
2014/01/09 PHP
PHP常用的小程序代码段
2015/11/14 PHP
Yii框架上传图片用法总结
2016/03/28 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
2018/02/24 jQuery
Vue的轮播图组件实现方法
2018/03/03 Javascript
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
2018/05/15 NodeJs
layui表格内容溢出的解决方法
2019/09/06 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
详解Vue.js 可拖放文本框组件的使用
2021/03/03 Vue.js
Python实现的txt文件去重功能示例
2018/07/07 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
如何进行Linux分区优化
2016/09/13 面试题
会计主管岗位职责
2014/01/03 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
顶岗实习计划书
2015/01/16 职场文书
团代会邀请函
2015/02/02 职场文书
2015年七一建党节活动总结
2015/03/20 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
python高温预警数据获取实例
2022/07/23 Python