Tengo una pequeña aplicación django: el usuario carga un archivo, el archivo se modifica en el lado del servidor y el archivo modificado se devuelve al usuario como descarga. Para proporcionar un buen formulario de carga de archivos de arrastrar y soltar, uso dropzone.js. El formulario contiene otros elementos de entrada, así que seguí este howto . Después de enviar el formulario, la vista Django devuelve un objeto HttpResponse:
response = HttpResponse(f.read(), content_type="application/pdf") response['Content-Disposition'] = 'attachment; filename="%s"' % input_fileMi problema es: si uso el formulario basado en dropzone, la respuesta no se muestra, es decir, el navegador no muestra un cuadro de diálogo de descarga.
Aquí está el ejemplo mínimo de mi archivo html:
<form method="post" class="dropzone" action="/mysite/" enctype="multipart/form-data" id="myForm"> {% csrf_token %} <select name="selectpdf" size="1"> // filled by django magic </select> <p><button type="submit">Do it!</button></p> </form> <script type="text/javascript"> Dropzone.options.myForm = { // Prevents Dropzone from uploading dropped files immediately autoProcessQueue : false, forceFallback : false, init : function() { myDropzone = this; this.element.querySelector("button[type=submit]").addEventListener("click", function(e) { // Make sure that the form isn't actually being sent. e.preventDefault(); e.stopPropagation(); myDropzone.processQueue(); }); } }; </script> Cuando uso un formulario HTML normal (es decir, sin class="dropzone" y usando un campo de carga de archivos estándar), todo funciona perfectamente. Además, si activo el modo alternativo de dropzones (que básicamente hace lo mismo), todo está bien. Por lo tanto, supongo que el problema no está relacionado con la parte de django.
Después de presionar el botón Enviar, observo que myDropzone.processQueue(); se ejecuta correctamente (porque el archivo se carga) y el archivo cargado se maneja correctamente en el lado del servidor (es decir, el archivo se modifica y se genera y devuelve la HttpResponse adecuada). Sin embargo, el cliente nunca lo ve. También observé que el formulario parece estar en un estado incorrecto, porque si presiono el botón de enviar nuevamente, no sucede nada.
Para mí, parece que falta alguna redirección final del lado del cliente basada en JavaScript, que se hace implícitamente cuando se usa el método HTML simple.
De acuerdo con el howto, puedo capturar ciertos eventos como
this.on("success", function(files, response) { ... }para redirigir al usuario. Pero, de hecho, no quiero redirigirlo, quiero el mismo comportamiento que con el método HTML simple (es decir, permanecer en el sitio, completar el formulario, proporcionar la descarga y poder presionar el botón Enviar nuevamente) .
¿Alguien puede ayudar?