Django crea documentos .odt o .docx para descargar

Necesito generar archivos .odt o .docx basados ​​en la información que tengo en mi base de datos. Digamos que tengo un modelo:

class Contact(models.Model): first_name = models.CharField() last_name = models.CharField() email = models.EmailField() 

Quiero que los usuarios puedan generar un documento de Office que contenga esa información y también algún otro texto. Eché un vistazo a este ejemplo que usa python-docx y me da una idea de cómo generar ese documento. Pero no puedo averiguar dónde se guarda este archivo o incluso si se ha creado. En mi plantilla tengo un enlace:

 generate .docx document 

donde generate_docx() ejecuta el código que se puede encontrar en el enlace que proporcioné anteriormente.

¿Cómo puedo implementar mi sistema para que cuando se haga clic en mi enlace, el documento se cree o actualice en función de los datos en la base de datos y luego se descargue en la computadora de los usuarios? No es obligatorio guardar ese documento en la base de datos, pero también me interesa saber cómo hacerlo.

    Puede usar el lenguaje de plantilla django dentro de un archivo docx, que en realidad es un archivo zip de archivos xml, y luego ejecutar el archivo xml apropiado a través del motor de plantillas. Tengo la idea aquí: http://reinout.vanrees.org/weblog/2012/07/04/document-automation.html

    Aunque es más fácil decirlo que hacerlo. Eventualmente, lo puse corriendo en python3 de esta manera:

     from zipfile import ZipFile from io import BytesIO from django.template import Context, Template def render_to_docx(docx, context): tmp = BytesIO() with ZipFile(tmp, 'w') as document_zip, ZipFile(docx) as template_zip: template_archive = {name: template_zip.read(name) for name in template_zip.namelist()} template_xml = template_archive.pop('word/document.xml') for n, f in template_archive.items(): document_zip.writestr(n, f) t = Template(template_xml) document_zip.writestr('word/document.xml', t.render(Context(context))) return tmp 

    Y en la vista:

     response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename=document.docx' zipfile = render_to_docx('template.docx'), context_dictionary) response.write(zipfile.getvalue()) return response 

    Puede crear su archivo .docx usando Py2docx ( https://github.com/rafaels88/py2docx ). Ponga su código en una vista, y después de eso puede hacer esto:

     # Here goes the Py2docx code # After save the .docx file, do this: file_docx = open("path/file.docx", 'r') response = HttpResponse(mimetype='text/html') response['Content-Disposition'] = 'attachment; filename=file_name.docx' response['Content-Encoding'] = 'UTF-8' response['Content-type'] = 'text/html; charset=UTF-8' response.write(file_docx.read()) file_docx.close() return response 

    Luego, crea un enlace en HTML a la url de tu vista.

    Si pdf también es un formato aceptable, podría considerar usar django-wkhtmltopdf . Le permitirá crear una página normal y convertirla a pdf utilizando una forma binaria de webkit.