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模块使用代理实例
May 29 Python
在Python的Django框架中加载模版的方法
Jul 16 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
python 统计文件中的字符串数目示例
Dec 24 Python
Python3实现飞机大战游戏
Apr 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原理之异常机制
2010/08/21 PHP
Admin generator, filters and I18n
2011/10/06 PHP
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
js 内存释放问题
2010/04/25 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
jquery中radio checked问题
2015/03/16 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
JS实现移动端按首字母检索城市列表附源码下载
2017/07/05 Javascript
javascript实现QQ空间相册展示源码
2017/12/12 Javascript
详解处理Vue单页面应用SEO的另一种思路
2018/11/09 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
python邮件发送smtplib使用详解
2020/06/16 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
应届生个人求职信模板
2013/11/26 职场文书
结婚典礼证婚词
2014/01/11 职场文书
会员活动策划方案
2014/08/19 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis