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 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
运行django项目指定IP和端口的方法
May 14 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
May 13 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
安装python及pycharm的教程图解
Oct 10 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
使用python的turtle绘画滑稽脸实例
Nov 21 Python
python解析多层json操作示例
Dec 30 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
keras 自定义loss层+接受输入实例
Jun 28 Python
python 爬虫如何正确的使用cookie
Oct 27 Python
python定义具名元组实例操作
Feb 28 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 柱状图实现代码
2009/12/04 PHP
PHP 基于文件头的文件类型验证类函数
2012/05/01 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
js中的面向对象入门
2017/03/06 Javascript
微信小程序 http请求的session管理
2017/06/07 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
python实现从web抓取文档的方法
2014/09/26 Python
Python 3中的yield from语法详解
2017/01/18 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
python数据归一化及三种方法详解
2019/08/06 Python
Python实现打印实心和空心菱形
2019/11/23 Python
联想德国官网:Lenovo Germany
2018/07/04 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
教师推荐信范文
2013/11/24 职场文书
好军嫂事迹材料
2014/01/15 职场文书
《假如》教学反思
2014/04/17 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
邹越演讲观后感
2015/06/15 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
Selenium浏览器自动化如何上传文件
2022/04/06 Python