Я нашел некоторые документы по Python, относящиеся к docxtpl, по этой ссылке:
https://docxtpl.readthedocs.io/en/latest/
Я последовал инструкции и ввел код, найденный на этом сайте, в представление и создал соответствующий URL-адрес. Когда я перехожу по URL-адресу, я хотел бы, чтобы документ был сгенерирован, но я получаю сообщение об ошибке, что ответ HTTP не возвращается. Я понимаю, что не определяю его, но я немного смущен тем, какой HTTP-ответ мне нужно определить (я все еще очень новичок в этом). Шаблон MS Word, который я сохранил, называется «template.docx».
Любая помощь будет принята с благодарностью!
ПРОСМОТРОВ.PY
def doc_test(request):
doc = DocxTemplate("template.docx")
context = { 'ultimate_consignee' : "World company" }
doc.render(context)
doc.save("generated_doc.docx")
Я хотел бы получить доступ к этому представлению для создания документа, где переменные заполнены тем, что определено в контексте выше.





Суть: Прочитать содержимое файла и вернуть данные в ответе 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 о том, как прочитать содержимое файла.
@ GXM100 Сохраните этот код. Вот почему я написал многоточие (...) в качестве заполнителя для вашего кода.
@xyres Как я могу поместить изображение в шаблон с URL-адреса?
Вот более краткое решение:
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')
Я вижу, как это генерирует документ, но как мне сделать эквивалент «context = { 'ultimate_consignee': «Всемирная компания» } doc.render(context), поскольку мне нужно, чтобы эта переменная Ultimate_consignee была заполнена в шаблоне Word