文件下載功能django+js

轉:https://www.cnblogs.com/supery007/p/9360188.htmljavascript

1. 功能敘述html

前端web頁面經過訪問url+id的形式訪問url
lottery/draw/(?P<pk>(\d+))/download/
後端代碼經過orm查詢pk相關數據
過濾出本身想要的字段

2. 前端頁面前端

<a onclick="downloadFilebyAjax(this,'{{ period.id }}')" href="javascript:;" title="下載">
         <i class="layui-icon">&#xe601;</i>#下載圖標
</a>
複製代碼
    /*下載統計*/
    function downloadFilebyAjax(obj, id) {
        layer.confirm('確認要下載嗎?', function (index) {
            $.ajaxSetup({
                data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
            });
            $.ajax({
                type: "post",
                url: id + '/download/',
                dataType: "json",
                success: function (data) {
                    if (data.status) {
                        console.log(data.filePath, "文件下載中... ...");
                        window.location.href = data.filePath;
                        layer.msg(data.msg, {icon: 6, time: 1000});
                    } else {
                        layer.msg(data.msg, {icon: 5, time: 1000});
                    }
                },
                error: function (data) {
                    console.log("對不起,網絡錯誤,請稍後重試或聯繫管理員");
                }
            });
        });
    }
複製代碼

3. 後端功能java

複製代碼
def download_draw(request,pk):
    if request.method =="POST":
        data = {'status':True,'msg': '下載成功','filePath':''}
        searia_list= huodong_models.SearialNum.objects.filter(period_id=pk)
        xls_name = searia_list[0].period.title+'.xls'
        xls_path =os.path.join(settings.BASE_DIR, 'static','download',xls_name)
        if os.path.exists(xls_path):
            os.remove(xls_path)
        book = xlwt.Workbook(encoding='utf-8')
        sheet = book.add_sheet(searia_list[0].period.title, cell_overwrite_ok=True)
        # 第0行寫入標題
        sheet.write(0,0,'期號')
        sheet.write(0,1,'抽獎碼')
        sheet.write(0,2,'會員帳號')
        sheet.write(0,3,'得到獎品')
        sheet.write(0,4,'使用狀態')
        # 初始行,寫入數據從第一行開始寫入
        line = 1
        manipulation(searia_list,line,sheet)
        book.save(xls_path)
        if os.path.exists(xls_path):
            filePath = '/static/download/%s' % xls_name
            data['filePath']=filePath
        else:
            data['status']=False
            data['msg']='下載失敗'
        return JsonResponse(data)
    return HttpResponse('無效請求')
複製代碼
複製代碼
def manipulation(searia_list,line,sheet):
    for searia in searia_list:
        vip_acount = ''
        prize = ''
        style = 0
        if searia.status == 1:
            vip_acount = searia.userinfo.vip_acount
            prize = searia.userinfo.prize
            style = 2
        sheet.write(line, 0, searia.period.period)
        sheet.write(line, 1, searia.searial)
        sheet.write(line, 2, vip_acount)
        sheet.write(line, 3, prize)
        sheet.write(line, 4, searia.get_status_display())
        line += 1
複製代碼

4. 說明代碼思路web

複製代碼
先初始化execl文件第0行標題名稱
以後經過數據庫取出的數據生成一個數據列表
初試行位第一行一次循環寫入每條字段過濾的數據
初試行數以此累加
最後保存execl文件
而後將服務器的保存的地址返回給前端
經過window.location.href來進行訪問實現下載
複製代碼
相關文章
相關標籤/搜索