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 字符串中的字符倒转
Sep 06 Python
Python实现的简单万年历例子分享
Apr 25 Python
Python Queue模块详解
Nov 30 Python
python简单获取数组元素个数的方法
Jul 13 Python
OpenCV实现人脸识别
Apr 07 Python
Python File readlines() 使用方法
Mar 19 Python
使用Python对微信好友进行数据分析
Jun 27 Python
详解python持久化文件读写
Apr 06 Python
python中的print()输出
Apr 12 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
keras 使用Lambda 快速新建层 添加多个参数操作
Jun 10 Python
python requests模块的使用示例
Apr 07 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/07/19 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
php实现的DateDiff和DateAdd时间函数代码分享
2014/08/16 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
2017/03/21 jQuery
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
python中__call__内置函数用法实例
2015/06/04 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
村庄环境整治方案
2014/05/15 职场文书
森林防火标语
2014/06/23 职场文书
西湖英语导游词
2015/02/06 职场文书
骨干教师个人总结
2015/02/11 职场文书
2015年维修工作总结
2015/04/25 职场文书
小学生手册家长意见
2015/06/03 职场文书
于丹论语心得观后感
2015/06/15 职场文书
放假通知怎么写
2015/08/18 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
python数字转对应中文的方法总结
2021/08/02 Python