在Django Admin中触发自定义功能

时间:2016-05-04 06:57:25

标签: python django django-admin

我是Django和Django Admin的新手,所以我仍然不是100%正确的名字。

在使用模型的管理员应用时,我想在列表视图中添加“全部下载”按钮/链接/操作。理想情况下就像“添加”按钮一样。我尝试了一个自定义操作,它几乎让我在那里,但它坚持要在它触发之前选择至少一行。

我非常专注于快速提供结果 - 只要我能向用户解释如何使用该应用程序 - 然后完成工作。

我正在使用Django 1.9。

1 个答案:

答案 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