为了实现此功能,需要用到的知识点:
(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',)
效果: