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 文件和路径操作函数小结
Nov 23 Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
python3实现跳一跳点击跳跃
Jan 08 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
python dict 相同key 合并value的实例
Jan 21 Python
python中property属性的介绍及其应用详解
Aug 29 Python
python中如何使用insert函数
Jan 09 Python
Python 没有main函数的原因
Jul 10 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
如何将json数据转换为python数据
Sep 04 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
Nov 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
python杀死一个线程的方法
2015/09/06 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
PyQt5实现简易电子词典
2019/06/25 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
.net笔试题
2014/03/03 面试题
文言文形式的学生求职信
2013/12/03 职场文书
工伤赔偿协议书
2014/04/15 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
学生违反校规检讨书
2014/10/28 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
招商银行工作证明
2015/06/17 职场文书
如何做好工作总结!
2019/04/10 职场文书
python实现高效的遗传算法
2021/04/07 Python
react 路由Link配置详解
2021/11/11 Javascript