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代码制作configure文件示例
Jul 28 Python
十条建议帮你提高Python编程效率
Feb 16 Python
python里使用正则的findall函数的实例详解
Oct 19 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python简单基础小程序的实例代码
Apr 28 Python
利用Django模版生成树状结构实例代码
May 19 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
学习Python需要哪些工具
Sep 04 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+javascript模拟Matrix画面
2006/10/09 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
html静态页面调用php文件的方法
2014/11/13 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
VUE2.0+ElementUI2.0表格el-table循环动态列渲染的写法详解
2018/11/30 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
工业自动化专业毕业生推荐信
2013/11/18 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
专科生就业求职信
2014/06/22 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
2014年销售员工作总结
2014/12/01 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
Python机器学习三大件之一numpy
2021/05/10 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang