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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Python生成验证码实例
Aug 21 Python
Python中max函数用法实例分析
Jul 17 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
Python如何用filter函数筛选数据
Mar 05 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
django日志默认打印request请求信息的方法示例
May 17 Python
python redis存入字典序列化存储教程
Jul 16 Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 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
德劲1103的维修打理经验
2021/03/02 无线电
php环境配置 php5 MySQL5 apache2 phpmyadmin安装与配置图文教程
2007/03/16 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
详解php中反射的应用
2016/03/15 PHP
yii框架搜索分页modle写法
2016/12/19 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
关于js datetime的那点事
2011/11/15 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python全排列操作实例分析
2018/07/24 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
python collections模块的使用
2020/10/16 Python
什么是Web Service?
2012/07/25 面试题
公司人事专员岗位职责
2014/08/11 职场文书
重阳节活动总结
2014/08/27 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Go 中的空白标识符下划线
2022/03/25 Golang