Archivo docx descargable en Django

Mi aplicación web de django crea y guarda docx y necesito que sea descargable. Yo uso simple render_to_response como a continuación.

 return render_to_response("test.docx", mimetype='application/vnd.ms-word') 

Sin embargo, genera un error como 'utf8' codec can't decode byte 0xeb in position 15: invalid continuation byte

No podría servir este archivo como estático, así que necesito encontrar una manera de servirlo así. Realmente aprecio por cualquier ayuda.

Sí, una opción más limpia, según lo establecido por wardk sería, utilizando https://python-docx.readthedocs.org/ :

 from docx import Document from django.http import HttpResponse def download_docx(request): document = Document() document.add_heading('Document Title', 0) response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename=download.docx' document.save(response) return response 

Logré generar un documento docx desde una vista de django gracias a python-docx .

Aquí hay un ejemplo. Espero que ayude

 from django.http import HttpResponse from docx import Document from cStringIO import StringIO def your_view(request): document = Document() document.add_heading(u"My title", 0) # add more things to your document with python-docx f = StringIO() document.save(f) length = f.tell() f.seek(0) response = HttpResponse( f.getvalue(), content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document' ) response['Content-Disposition'] = 'attachment; filename=example.docx' response['Content-Length'] = length return response 

Intenta con esta respuesta:

 response = HttpResponse(mydata, mimetype='application/vnd.ms-word') response['Content-Disposition'] = 'attachment; filename=example.doc' return response 

¿Es posible que su ruta de acceso a ‘test.docx’ contenga caracteres no ASCII? ¿Revisaste todas las variables locales en la página de depuración de django?

Lo que hice para descargar un archivo xml no fue crear el archivo en el disco, sino usar un archivo de memoria (me impide tratar con los sistemas de archivos, la ruta, …):

  memory_file = StringIO.StringIO() memory_file.writelines(out) #out is an XMLSerializer object in m case response = HttpResponse(memory_file.getvalue(), content_type='application/xml') response['Content-Disposition'] = 'attachment; filename="my_file.xml"' response['Content-Length'] = memory_file.tell() return response 

Quizás puedas adaptar esto a tu situación docx.