Django Admin中增加导出CSV功能过程解析
作者:韩志超 时间:2021-04-17 06:22:47
参考 https://books.agiliq.com/projects/django-admin-cookbook/en/latest/export.html
在使用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']
来源:https://www.cnblogs.com/superhin/p/11454756.html
标签:django,admin,导出,csv
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
MYSQL数据库设计的一点总结
2008-05-24 09:36:00
Python+Opencv识别两张相似图片
2022-11-07 09:12:55
![](https://img.aspxhome.com/file/2023/0/97070_0s.jpg)
python实现希尔密码加密的示例代码
2022-06-16 07:55:31
Python实现Opencv cv2.Canny()边缘检测
2022-12-01 13:26:37
![](https://img.aspxhome.com/file/2023/4/97204_0s.png)
微信小程序开发之获取用户手机号码(php接口解密)
2023-11-15 03:34:59
![](https://img.aspxhome.com/file/2023/3/84863_0s.png)
YUI学习笔记(3)
2009-01-21 16:24:00
numpy和pandas中数组的合并、拉直和重塑实例
2022-06-28 02:55:07
面向对象的CSS
2009-07-03 12:23:00
Python如何读取相对路径文件
2023-12-06 17:03:18
![](https://img.aspxhome.com/file/2023/4/98854_0s.png)
网站如何使用黄金分割布局
2010-11-05 18:34:00
![](https://img.aspxhome.com/file/UploadPic/201011/5/01-29s.jpg)
asp如何让用户也能修改密码?
2010-05-13 16:41:00
Python opencv图像基本操作学习之灰度图转换
2023-02-17 09:04:43
![](https://img.aspxhome.com/file/2023/1/96951_0s.jpg)
ASP:一个网站空间多个域名访问
2008-11-21 17:03:00
從無到有實現一個xml數據庫登錄驗証
2008-09-05 17:12:00
python人工智能tensorflow函数tf.nn.dropout使用方法
2023-11-16 17:45:44
![](https://img.aspxhome.com/file/2023/2/86682_0s.png)
DWCS3-CSS布局之二CSS规则定义
2008-06-16 13:36:00
![](https://img.aspxhome.com/file/UploadPic/20086/16/2008616134735230s.png)
Python tkinter常用操作代码实例
2021-01-05 21:26:09
Web 设计:实现干净代码的12条定律
2008-12-04 13:27:00
![](https://img.aspxhome.com/file/UploadPic/200812/4/22008111521256-30.gif)
如何实现html表格里隔行换色
2007-10-19 13:42:00
python和bash统计CPU利用率的方法
2023-10-15 06:28:25