2011-08-06 10 views
9

Quindi sto lavorando con django e upload di file e ho bisogno di una funzione javascript da eseguire dopo che il file è stato caricato. Ho un gestore di upload di file nel mio views.py che assomiglia a questo:Ottieni Django views.py per tornare ed eseguire 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.") 

e ho trovato un frammento di Django da http://djangosnippets.org/snippets/341/ e ho messo la classe HttpJavascriptResponse nel mio codice views.py. Sembra come segue:

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

Tuttavia, quando aggiungo un file il semplice browser rende "parent.Response_OK();" sullo schermo invece di eseguire effettivamente il javascript. E Chrome mi avvisa: "Risorsa interpretata come documento ma trasferita con testo MIME text/javascript"

Esiste comunque la possibilità di ottenere views.py per eseguire lo script?

risposta

6

Credo che funzionerà.

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

Tuttavia, si potrebbe pensare di tornare un successo (200) codice di stato in questo caso, e poi avere un javascript nel genitore allegare alla manifestazione carico di questo bambino, e il ramo sulla base di codice di stato di ritorno. In questo modo hai una separazione tra il codice di rendering della vista e il codice di comportamento della vista.

+0

il codice funziona, ma ho intenzione di prendere il vostro consiglio e cercare di avere grilletto javascript del genitore quando il bambino restituisce lo stato di successo. Grazie! – Alexandra

9

Un modo migliore è passare il mime all'oggetto HttpResponse.

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

Nelle versioni recenti di django, 'mimetype' è stato sostituito da [' content_type'] (https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpResponse.__init__). Tuttavia, questo non sembra funzionare e lo script esegue il rendering come testo normale anziché eseguirlo. –

3

soluzione di Chase ha lavorato per me, anche se ho bisogno di eseguire più javascript di quanto mi piaccia mettere in una stringa di pitone:

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

Questa soluzione esegue lo script e quindi esegue il rendering di un testo normale. C'è una soluzione che esegue solo lo script e rimane sulla stessa pagina? – sidpat

+0

@sidpat deve fare lo stesso. L'hai capito? – Anupam

+0

@sidpat, ho usato window.location.href = percorso/su/corrente/pagina in js per recuperare la stessa pagina ed eseguire js – Anupam

0

Ho finito qui in cerca di un modo per servire una file js dinamico utilizzando django.

Ecco la mia soluzione:

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