为ModelAdmin定制,导出CSV插件

在utils文件夹中创建export_as_csv.py, 然后定义处理函数:

"""
导出QuerySet为CSV插件,为ModelAdmin定制.
"""

import csv
import codecs
from django.http import HttpResponse

def exportcsv(modeladmin, request, queryset):
    res = HttpResponse(content_type='text/csv')
    res['Content-Disposition'] = 'attachment; filename="abc.csv"'
    res.write(codecs.BOM_UTF8)
    writer = csv.writer(res)
    writer.writerow(["title", "summary", "publisher", "href", "category", "recommend", "add_time"])
    for obj in queryset:
        writer.writerow(
            [obj.title, obj.summary, obj.publisher, obj.href, obj.category, obj.recommend, obj.add_time])
    return res

exportcsv.short_description = "导出为CSV文件"

通用处理函数:

import datetime
import csv
import codecs
from django.http import HttpResponse


def export_as_csv(model_admin, request, queryset):
    """
    :param model_admin: 要求model_admin中必须定义list_display字段
    :param request:
    :param queryset: 为界面中选中的queryset obj集合
    :return: s
    """
    filename = queryset.model._meta.model_name + datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    res = HttpResponse(content_type="text/csv")
    res["Content-Disposition"] = "attachment; filename={filename}.csv".format(filename=filename)
    res.write(codecs.BOM_UTF8)
    writer = csv.writer(res)
    writer.writerow(model_admin.list_display)

    for obj in queryset:
        writer.writerow([getattr(obj, field) for field in model_admin.list_display])
    return res

export_as_csv.short_description = "导出为CSV文件"
View Code

 

admin.py

from django.contrib import admin
from utils.export_as_csv import exportcsv

class NewsAdmin(admin.ModelAdmin):
    list_display = ["title", "summary", "publisher", "href", "category", "recommend", "add_time"]
    actions = [exportcsv]

 

效果图:

 

posted @ 2017-06-09 17:04  Vincen_shen  阅读(238)  评论(0)    收藏  举报