2011-08-06 39 views
9

因此,我正在使用django和文件上傳,並且需要在文件上傳後執行javascript函數。 我在views.py文件上傳處理程序看起來像這樣:Get Django views.py返回並執行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.") 

而且我發現一個Django片段從http://djangosnippets.org/snippets/341/,我把HttpJavascriptResponse類在我的views.py代碼。它看起來如下:

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

但是,當我上傳文件瀏覽器簡單地呈現「parent.Response_OK();」在屏幕上而不是實際執行JavaScript。和Chrome給我的警告:「資源解釋爲文檔,但與MIME類型文本/ JavaScript傳輸」

有無論如何獲取views.py執行腳本?

回答

6

我相信這會奏效。

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

然而,你可能會想到在這種情況下返回成功(200)狀態代碼,然後在其父母一些JavaScript附加到這個孩子的加載事件,並根據返回的狀態代碼分支。這樣你就有了視圖渲染代碼和視圖行爲代碼的分離。

+0

代碼工作,但我會接受你的建議,並嘗試將母公司的javascript觸發時,孩子返回成功狀態。謝謝! – Alexandra

9

更好的方法是將MIME傳遞給HttpResponse對象。

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

在最近版本的django,'mimetype'已經被替換爲['content_type'](https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpResponse.__init__)。但是,這似乎並不奏效,腳本呈現爲純文本而不是執行。 –

3

大通的解決方案爲我工作,但我需要執行更多的JavaScript比我想放在一個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

該解決方案運行腳本,然後呈現純文本。是否有解決方案只運行腳本並保持在同一頁面上? – sidpat

+0

@sidpat需要做的一樣。你弄明白了嗎? – Anupam

+0

@sidpat,我用在JS window.location.href =路徑/到/電流/頁找回相同的頁面和JS運行 – Anupam

0

我在這裏結束了尋找一種方式來服務於動態js文件使用django

這裏是我的解決方案:

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