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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
简单实现python数独游戏
Mar 30 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
python re.sub()替换正则的匹配内容方法
Jul 22 Python
python django生成迁移文件的实例
Aug 31 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
详解django中Template语言
Feb 22 Python
Python操作CSV格式文件的方法大全
Jul 15 Python
python函数的两种嵌套方法使用
Apr 02 Python
Python实现简单得递归下降Parser
May 02 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
提问的智慧(2)
2006/10/09 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php多重接口的实现方法
2015/06/20 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
PHP 实现 JSON 数据的编码和解码操作详解
2020/04/22 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
jquery无缝图片轮播组件封装
2020/11/25 jQuery
小程序根据手机机型设置自定义底部导航距离
2019/06/04 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
2014年乡镇工会工作总结
2014/12/02 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
表扬信范文
2015/05/04 职场文书
2016大一新生军训感言
2015/12/08 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL