假设你须要在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