从Django填充MS Word模板

时间:2019-07-15 23:27:55

标签: django ms-word docx

我在此链接中找到了一些与docxtpl相关的python文档:

https://docxtpl.readthedocs.io/en/latest/

我按照说明进行操作,并将在此站点上找到的代码输入到视图中,并创建了关联的URL。当我转到URL时,我想生成一个文档-但出现错误,没有HTTP响应返回。我知道我没有定义一个,但是我对我需要定义的HTTP响应有些困惑(对此我仍然很陌生)。我保存的MS Word模板名为“ template.docx”。

任何帮助将不胜感激!

VIEWS.PY

def doc_test(request):


    doc = DocxTemplate("template.docx")
    context = { 'ultimate_consignee' : "World company" }
    doc.render(context)
    doc.save("generated_doc.docx")

我想访问此视图以生成文档,在该文档中,变量被上面上下文中定义的内容填充。

2 个答案:

答案 0 :(得分:0)

要点::读取文件的内容,并将数据返回HTTP响应。


首先,您必须将文件保存在内存中,以便于阅读。您需要将其保存到类似文件的对象中,而不是保存为doc.save("generated_doc.docx")这样的文件名。

然后读取该文件状对象的内容,并在HTTP响应中返回它。

import io
from django.http import HttpResponse


def doc_test(request):
    doc = DocxTemplate("template.docx")
    # ... your other code ...

    doc_io = io.BytesIO() # create a file-like object
    doc.save(doc_io) # save data to file-like object
    doc_io.seek(0) # go to the beginning of the file-like object

    response = HttpResponse(doc_io.read())

    # Content-Disposition header makes a file downloadable
    response["Content-Disposition"] = "attachment; filename=generated_doc.docx"

    # Set the appropriate Content-Type for docx file
    response["Content-Type"] = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

    return response

注意:该代码可能有效也可能无法工作,因为我尚未对其进行测试。但是一般原理保持不变,即读取文件的内容,并在带有适当标头的HTTP响应中返回文件。

因此,如果此代码不起作用,可能是因为您使用的软件包不支持写入类似文件的对象或出于某些其他原因,那么最好询问软件包的创建者或在其Github上提交有关如何读取文件内容的问题。

答案 1 :(得分:0)

这是一个更简洁的解决方案:

import os
from io import BytesIO
from django.http import FileResponse
from docxtpl import DocxTemplate

def downloadWord(request, pk):
    context = {'first_name' : 'xxx', 'sur_name': 'yyy'}
    byte_io = BytesIO()
    tpl = DocxTemplate(os.path.join(BASE_PATH, 'template.docx'))
    tpl.render(context)
    tpl.save(byte_io)
    byte_io.seek(0)
    return FileResponse(byte_io, as_attachment=True, filename=f'generated_{pk}.docx')