尽管其他答案完全有效,但我认为重要的是要注意绝对没有必要添加按钮来获得这种行为。您可以使用管理员操作,就像您对make_published
操作所做的那样。
这是不需要覆盖任何模板的优点,因此可以防止升级 django 版本时出现潜在问题(因为管理模板可能会更改,并且更改可能与您覆盖它的方式不“兼容”)。
import csv
from django.http import HttpResponse
from django.utils import timezone
def export_as_csv(modeladmin, request, queryset):
opts = modeladmin.model._meta
filename = format(timezone.now(), "{app}_{model}-%Y%m%d_%H%M.csv").format(
app=opts.app_label, model=opts.model_name)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
writer = csv.writer(response)
field_names = [f.get_attname() for f in opts.concrete_fields]
writer.writerow(field_names)
for obj in queryset.only(*field_names):
writer.writerow([str(getattr(obj, f)) for f in field_names])
return response
为此进行了管理操作,添加自定义按钮更接近“过度自定义”,这意味着可能是时候编写自己的视图了。
管理员有许多用于自定义的钩子,但请注意不要尝试专门使用这些钩子。如果您需要提供一个更加以流程为中心的接口来抽象出数据库表和字段的实现细节,那么可能是时候编写自己的视图了。
引用自Django Admin 文档的介绍段落