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

相關文章
相關標籤/搜索