zoukankan      html  css  js  c++  java
  • django admin 中实现word文档下载

    为了实现此功能,需要用到的知识点:

    (1)django  admin  自定义字段;

        参考:http://www.cnblogs.com/wumingxiaoyao/p/6928297.html

    (2)使用 docxtpl 模块 对word文档内容 进行替换; 

        参考:http://www.cnblogs.com/wumingxiaoyao/p/8315814.html

    (3)使用django 的  FileResponse 模块 实现文档下载;

             参考:http://blog.csdn.net/lmw1239225096/article/details/79047375

    主要代码:

    url.py:

    from django.conf.urls import url
    from hys_operation import views
    
    urlpatterns = [
        # url(r'^sub_users/(?P<obj_id>d+)', views.get_sub_users),
        # url(r'^sub_servers/(?P<obj_id>d+)', views.get_sub_servers),
        url(r'^download/(?P<paper_num>w+)', views.download, name='download'),
    ]
    

    views.py:

    from django.http import FileResponse
    
    def download(request, paper_num):
        """
        下载数据备案单
        :param request:
        :param paper_num: 备案单号
        :return: 数据流
        """
        # file_path = '/webserver/hys_cmdb/static/download/'
        file_path = 'E:\myweb\hys_cmdb\static\download\'
        file = open("{}{}.docx".format(file_path, paper_num), "rb")
        response = FileResponse(file)
        response['Content-Type'] = 'application/octet-stream'
        response['Content-Disposition'] = 'attachment;filename="{}.docx"'.format(paper_num)
        return response
    

    admin.py:

    class DataPaperStoreAdmin(admin.ModelAdmin):
    
        ......
    
        def down_paper(self, obj):
            """自定义一个a标签,跳转到实现下载功能的url"""
            dest = '{}export/'.format(obj.pk)
            title = '下载'
            return '<a href="{}">{}</a>'.format(dest, title)
        down_paper.short_description = '下载数据单'
        down_paper.allow_tags = True
    
        def get_urls(self):
            """添加一个url,指向实现下载功能的函数make_docx"""
            from django.conf.urls import url
            urls = [
                url('^(?P<pk>d+)export/?$',
                    self.admin_site.admin_view(self.make_docx),
                    name='export_data'),
            ]
            return urls + super(DataPaperStoreAdmin, self).get_urls()
    
        def make_docx(self, request, *args, **kwargs):
            from docxtpl import DocxTemplate
            import re
            file_path = 'E:\myweb\hys_cmdb\static\download\'
            # file_path = '/webserver/hys_cmdb/static/download/'
            obj = get_object_or_404(DataPaperStore, pk=kwargs['pk'])
            list_nums = re.findall("d+", obj.paper_num)  # 获取字符串中的所有数字
            nums = ''.join(list_nums)
            doc = DocxTemplate("{}export.docx".format(file_path))
            context = {'paper_num': obj.paper_num,
                       'project_name': obj.project_name,
                       'to_mail': obj.to_mail,
                       'data_selected': obj.data_selected,
                       'start_date': obj.start_date,
                       'end_date': obj.end_date,
                       }
            doc.render(context)
            doc.save("{}{}.docx".format(file_path, nums))
            new_path = reverse('download', args=(nums,))
            return HttpResponseRedirect(new_path)
    
        list_display = ('project_name', 'to_mail', 'proposer', 'frequency', 'commit_date',
                        'start_date', 'end_date', 'colored_paper_num', 'is_sure', 'expired', 'down_paper',)
    

      

    效果:

  • 相关阅读:
    mysql外键添加error1215
    shell命令获取最新文件的名称
    centos7 apache提供文件下载
    centos7 时间设置
    微服务通信的类型
    angular-cli
    npm
    模块相关
    加油!冲冲冲
    软件评测
  • 原文地址:https://www.cnblogs.com/wumingxiaoyao/p/8317548.html
Copyright © 2011-2022 走看看