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 相关文章推荐
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
解决python大批量读写.doc文件的问题
May 08 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
python性能测量工具cProfile使用解析
Sep 26 Python
Python queue队列原理与应用案例分析
Sep 27 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python中_del_还原数据的方法
Dec 09 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 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 PDO的一些认识小结
2015/01/23 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
如何获取vue单文件自身源码路径
2019/05/06 Javascript
js实现单元格拖拽效果
2020/02/10 Javascript
java直接调用python脚本的例子
2014/02/16 Python
Python实现的一个简单LRU cache
2014/09/26 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python reduce 函数使用详解
2017/12/05 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
python多任务之协程的使用详解
2019/08/26 Python
python实现马丁策略的实例详解
2021/01/15 Python
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
七年级音乐教学反思
2014/01/26 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
调研座谈会发言材料
2014/08/23 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python