假設你須要在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