重写django.admin,添加“导出Excel”按钮


记录重写过程中遇到的问题和最后解决的方法。

需求

重写django中admin自带的管理后台,筛选仿真任务列表,添加一个按钮,可以将筛选出的仿真任务列表以Excel的形式导出。

用到的第三方库

# 1.导出Excel的库
import xlwt
# 2.在内存中读写bytes的库
from io import BytesIO

xlwt库安装方式

  1. 用pip安装
pip install xlwt
  1. 源码安装(不联网的机器上)
    在 https://pypi.org/project/xlwt/ 中下载 xlwt-1.3.0.tar.gz(我下载时的最新版本)。
    上传压缩包到机器,解压,进入目录,执行命令安装
python setup.py install

记录筛选条件

用session记录用户点击的筛选条件,重写changelist_view方法:

    def changelist_view(self, request, extra_context=None):
        request.session['excel_params'] = json.dumps(request.GET.dict())

写导出Excel方法

取参数

	# 导出Excel
    def export_excel(self, request):
        # 取参数
        try:
            excel_params =  json.loads(request.session.get('excel_params'))
        except:
            excel_params = {}

按筛选条件查询作业列表后,创建文件对象,准备写入Excel。

文件操作

		# 设置HTTPResponse的类型
        response = HttpResponse(content_type='application/vnd.ms-excel')
        current_time = datetime.datetime.today().strftime("%Y-%m-%d")
        response['Content-Disposition'] = 'attachment;filename=jobs_list.xls' #导出文件名
        # 创建一个文件对象
        wb = xlwt.Workbook(encoding='utf8')
        # 创建一个sheet对象
        sheet = wb.add_sheet('order-sheet')

        # 设置文件头的样式,可以根据自己的需求进行更改
        style_heading = xlwt.easyxf("""
                    font:
                        name Arial,
                        colour_index white,
                        bold on,
                        height 0xA0;
                    align:
                        wrap off,
                        vert center,
                        horiz center;
                    pattern:
                        pattern solid,
                        fore-colour 0x19;
                    borders:
                        left THIN,
                        right THIN,
                        top THIN,
                        bottom THIN;
                    """)

        # 写入文件标题(行,列,内容,样式)
        sheet.write(0, 0, '任务名', style_heading)
        sheet.write(0, 1, '节点列表', style_heading)
        sheet.write(0, 2, 'CPU核数', style_heading)
        sheet.write(0, 3, '开始时间', style_heading)
        sheet.write(0, 4, '结束时间', style_heading)
        sheet.write(0, 5, '运行时间', style_heading)
        sheet.write(0, 6, '状态', style_heading)
        sheet.write(0, 7, '核小时数', style_heading)

        # 逐行写Excel.表头是第0行,内容从第1行写起
        data_row = 1
        for job in slurm_jobstatus_list:
            # 格式化datetime
            sheet.write(data_row, 0, job['JobName'])
            sheet.write(data_row, 1, job['NodeList'])
            sheet.write(data_row, 2, job['ReqCPUS'])
            sheet.write(data_row, 3, job['Start'].replace('T',' '))
            sheet.write(data_row, 4, job['End'].replace('T',' '))
            sheet.write(data_row, 5, job['Elapsed'])
            sheet.write(data_row, 6, job['State'])
            sheet.write(data_row, 7, job['job_cpu_time'])
            data_row = data_row + 1

        # 写出到IO
        output = BytesIO()
        wb.save(output)
        # 重新定位到开始
        output.seek(0)
        response.write(output.getvalue())
        return response

设置接口url

完成接口后,设置接口url方法:

    def get_urls(self):
        urls = super(CaeJoblistAdmin, self).get_urls()
        my_urls = [
            url('export_excel/', self.export_excel)
        ]
        return my_urls + urls

在前端加入按钮

在change_list.html中加入按钮

{% extends 'admin/change_list.html' %}
{% load static %}

{% block object-tools-items %}

    <div>
        <form action="export_excel/" method="POST">
            {% csrf_token %}
                <button type="submit">导出excel</button>
        </form>
    </div>

{% endblock %}

完成。

参考文献:

xlwt文档
在django中导出Excel

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值