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数据结构之二叉树的遍历实例
Apr 29 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Python中max函数用于二维列表的实例
Apr 03 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
python自动识别文本编码格式代码
Dec 26 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
python安装sklearn模块的方法详解
Nov 28 Python
Python命令行参数argv和argparse该如何使用
Feb 08 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设计模式中的工厂模式
2008/06/12 PHP
PHP计数器的实现代码
2013/06/08 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
python动态视频下载器的实现方法
2019/09/16 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python中如何引入第三方模块
2020/05/27 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
我的中国梦演讲稿600字
2014/08/19 职场文书
争先创优心得体会
2014/09/12 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
中学校园广播稿
2015/08/18 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang