我是Django和Django Admin的新手,所以我仍然不是100%正确的名字。
在使用模型的管理员应用时,我想在列表视图中添加“全部下载”按钮/链接/操作。理想情况下就像“添加”按钮一样。我尝试了一个自定义操作,它几乎让我在那里,但它坚持要在它触发之前选择至少一行。
我非常专注于快速提供结果 - 只要我能向用户解释如何使用该应用程序 - 然后完成工作。
我正在使用Django 1.9。
答案 0 :(得分:2)
第1步:首先覆盖位于/app/templates/admin/app/change_list.html的change_list.html。(如果没有创建一个)
change_list.html的内容如下所示
{% block object-tools %}
{% if has_add_permission %}
<ul class="grp-object-tools">
{% block object-tools-items %}
<li><a href="export/" class="grp-state-focus">
Export Data
</a></li>
<li><a href="add/{% if is_popup %}?_popup=1{% endif %}" class="grp-add-link grp-state-focus">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a></li>
{% endblock %}
</ul>
{% endif %}
{% endblock %}
第2步:在此表单的admin.py中添加get_urls方法
def get_urls(self):
urls = super(classname, self).get_urls() # replace wit your class name
my_urls = patterns(
'',
url(r'^export/$',
ExportCampaignView.as_view(), name='export'),
)
return my_urls + urls
第3步:在views.py中添加此逻辑以下载文件
XLSX_CONTENT_TYPE = ('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
class ExportCampaignView(generic.View):
def get(self, request, *args, **kwargs):
xlsx_file = self.create_xlsx()
response = HttpResponse(xlsx_file, content_type=XLSX_CONTENT_TYPE)
response['Content-Disposition'] = (
'attachment; filename=campaign.xlsx')
return response
@staticmethod
def create_xlsx():
"""
:return tablib.Dataset: Campaign data.
"""
output = StringIO()
workbook = xlsxwriter.Workbook(output)
sheet = workbook.add_worksheet()
bold_with_bg = workbook.add_format(
{'bold': True, 'bg_color': 'silver'})
date_format = workbook.add_format({'num_format': 'dd.mm.YYYY'})
headers = [
_(u'col1'), _(u'col2'), _(u'col3'),
]
data = Model.objects.all()
for row_idx, row in enumerate(data, start=1):
sheet.write(row_idx, 0, row.col1)
sheet.write(row_idx, 1, row.col2)
sheet.write(row_idx, 1, row.col3)
workbook.close()
output.seek(0)
return output