Django Admin Cookbook-13如何从Django Admin后台中导出CSV

2.如何从Django Admin后台中导出CSV?

假设你须要在Admin后台中,增长从导出Hero和导出Villain数据的功能。有许多Django第三方插件能够实现此操做,可是要本身实现也很是容易。你须要再HeroAdmin和VillanAdmin两个管理模型中添一个额外动做。html

Admin后台操做方法的签名是固定的,def admin_action(modeladmin, request, queryset):,你能够直接做为方法添加到你的管理模型中。python

class SomeModelAdmin(admin.ModelAdmin):
    def admin_action(self, request, queryset):

要将csv导出功能添加到HeroAdmin管理模型中,你能够修改以下:django

actions = ["export_as_csv"]
def export_as_csv(self, request, queryset):
    pass
export_as_csv.short_description = "Export Selected"

这将为后台添加一个名为export selected的额外操做,效果以下:spa

而后,将export_as_csv方法完善为:插件

import csv
from django.http import HttpResponse
...
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'] = 'attachment; filename={}.csv'.format(meta)
    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方法并不依赖Hero模型,所以能够将该方法封装到一个mixin类中。code

将代码修改以下:orm

class ExportCsvMixin:
    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'] = 'attachment; filename={}.csv'.format(meta)
        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 = "Export Selected"
@admin.register(Hero)
class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ("name", "is_immortal", "category", "origin", "is_very_benevolent")
    list_filter = ("is_immortal", "category", "origin", IsVeryBenevolentFilter)
    actions = ["export_as_csv"]
...
@admin.register(Villain)
class VillainAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ("name", "category", "origin")
    actions = ["export_as_csv"]

你能够在管理模型中,经过继承ExportCsvMixin来为该模型添加导出CSV功能。htm

返回目录blog

相关文章
相关标签/搜索