2011-08-06 18 views
9

Así que estoy trabajando con django y archivos cargados y necesito una función de JavaScript para ejecutar una vez que se haya cargado el archivo. que tienen un controlador de carga de archivos en mi views.py que se parece a esto:Obtenga Django views.py para devolver y ejecutar javascript

def upload_file(request): 
    form = UploadFileForm(request.POST, request.FILES) 
    if form.is_valid():   
     for f in request.FILES.getlist('fileAttachments'):  
      handle_uploaded_file(f) 
     return HttpJavascriptResponse('parent.Response_OK();') 
    else: 
     return HttpResponse("Failed to upload attachment.") 

y he encontrado un fragmento de Django http://djangosnippets.org/snippets/341/ y puse la clase HttpJavascriptResponse en mi código views.py. Se ve de la siguiente manera:

class HttpJavascriptResponse(HttpResponse): 
    def __init__(self,content): 
     HttpResponse.__init__(self,content,mimetype="text/javascript") 

Sin embargo, al cargar un archivo de la simple navegador hace que "parent.Response_OK();" en la pantalla en lugar de ejecutar el javascript. Y Chrome me da la advertencia: "Recurso interpretado como Documento pero transferido con texto tipo MIME/javascript"

¿Hay alguna forma de que viewspy ejecute el script?

Respuesta

6

Creo que esto funcionará.

return HttpResponse("<script>parent.Response_OK();</script>") 

Sin embargo, es posible pensar en volver un éxito (200) código de estado, en este caso, y luego tener algo de JavaScript en los padres adjuntar al evento de carga de este niño, y la rama sobre la base de código de estado devuelto. De esta forma, tiene una separación de código de representación de vista y código de comportamiento de vista.

+0

El código funciona, pero voy a seguir tu consejo y tratar de tener Javascript gatillo de los padres cuando el niño regrese al estado de éxito. ¡Gracias! – Alexandra

9

Una mejor manera es pasar el mimo al Objeto HttpResponse.

return HttpResponse("parent.Response_OK()", mimetype="application/x-javascript") 
+3

En versiones recientes de django, 'mimetype' ha sido reemplazado por [' content_type'] (https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpResponse.__init__). Sin embargo, esto no parece funcionar y el script se presenta como texto sin formato en lugar de ejecutarse. –

3

solución de Chase trabajó para mí, aunque tengo que ejecutar más javascript de los que puedo poner en una cadena de Python:

from django.http import HttpResponse 
from django.contrib.staticfiles.templatetags import staticfiles 

... 
    return HttpResponse("<script src='{src}'></script>".format(
     src = staticfiles.static('/path/to/something.js'))) 
+1

Esta solución ejecuta el script y luego procesa un texto sin formato. ¿Hay alguna solución que ejecute el script y se mantenga en la misma página? – sidpat

+0

@sidpat necesita hacer lo mismo. Lo averiguaste? – Anupam

+0

@sidpat, utilicé window.location.href = ruta/a/actual/página en el js para volver a la misma página y ejecutar js – Anupam

0

terminé aquí en busca de una manera de servir a una archivo js dinámico usando django.

Aquí está mi solución:

return render(request, 'myscript.js', {'foo':'bar'}, 
         content_type="application/x-javascript") 
Cuestiones relacionadas