2012-05-21 17 views
5

Usando Django, quiero que algunos datos estén disponibles para su descarga.generando un archivo con django para descargar con javascript/jQuery

Mi llamado jQuery tiene este aspecto hasta el momento:

$.getJSON("/get_data", 
      { users: users, study: "{{study.id}}" } , 
      function(json){ 
       alert('some data!'); 
      } 
); 

Este llama a uno de mis puntos de vista de Django, que a su vez genera un poco de JSON y los intentos de hacer que el texto JSON en un archivo para descargar

jsonResponse = json.dumps(data, cls=DjangoJSONEncoder) 

jsonFile = cStringIO.StringIO() 
jsonFile.write(jsonResponse) 

response = HttpResponse(jsonFile, mimetype='application/json') 
response['Content-Disposition'] = 'attachment; filename=data.txt' 

return response 

Sin embargo, esto no funciona. Después de mirar por un tiempo, creo que debería cambiar algo en ambos extremos, el Javascript y el código de Python/Django, pero no estoy seguro de qué es exactamente.

Para Python, mi principal preocupación es el uso de cStringIO (especialmente el hecho de que no puedo ejecutar cerrar en jsonFile antes de volver sin preguntar "ValueError: operación de E/S en archivo cerrado").

Tal vez también debería estar usando un FileWrapper (como en este post), pero obtengo resultados idénticos con y sin él.

Para Javascript, no estoy seguro de qué debería ir en mi función de controlador de éxito.

¡Cualquier apuntador sería muy apreciado!

+0

Usted quiere tener el usuario vea un cuadro de diálogo de descarga de archivos (guardar, ejecutar cancelar) o simplemente desea enviar datos JSON para el uso de JavaScript? – xbtsw

+0

Lo primero - Me gustaría hacer que aparezca un diálogo de navegador "guardado" (que, desde mi entendimiento, debería ocurrir con el encabezado "Content-Disposition", ¿correcto?) – arturomp

+0

@amp, que fuerza una _download_ en lugar de una representación en el navegador. Forzar un archivo guardado no parece ser algo que podamos hacer ... por ejemplo, tengo todas mis descargas yendo directamente a mi directorio de descargas. Las búsquedas de Google revelan declaraciones similares ... –

Respuesta

7

La solución clásica para esto es utilizar un iframe oculto.

En su urls.py

url(r'^test/getFile', 'getFile') 

En su views.py

def getFile(request): 
    fileContent = "Your name is %s" % request.GET['name'] 
    res = HttpResponse(fileContent) 
    res['Content-Disposition'] = 'attachment; filename=yourname.txt' 
    return res 

En su página de

<script type="text/javascript"> 
    var data = {name: 'Jon'}; 
    $(function(){ 
     $("body").append('<iframe src="/test/getFile?'+ $.param(data) + '" style="display: none;" ></iframe>'); 
    }); 
</script> 
Cuestiones relacionadas