2011-08-06 25 views
9

Vì vậy, tôi đang làm việc với django và tải lên tệp và tôi cần một hàm javascript để thực thi sau khi tệp đã được tải lên. Tôi có một bộ xử lý tải lên tập tin trong views.py của tôi trông như thế này:Nhận Django views.py để quay lại và thực hiện 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.") 

Và tôi tìm thấy một đoạn django từ http://djangosnippets.org/snippets/341/ và tôi đặt lớp HttpJavascriptResponse trong mã views.py tôi. Có vẻ như sau:

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

Tuy nhiên, khi tôi tải tệp lên trình duyệt đơn giản hiển thị "parent.Response_OK();" trên màn hình thay vì thực sự thực thi javascript. Và Chrome cho tôi cảnh báo: "Tài nguyên được hiểu là Tài liệu nhưng được chuyển với văn bản/javascript kiểu MIME"

Có anyway để có được views.py thực thi tập lệnh không?

Trả lời

6

Tôi tin rằng điều này sẽ hiệu quả.

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

Tuy nhiên, bạn có thể nghĩ đến việc trở lại là một thành công (200) mã trạng thái trong trường hợp này, và sau đó có một số javascript trong cha mẹ gắn với các sự kiện tải trọng của đứa trẻ này, và chi nhánh dựa trên mã trạng thái trở lại. Bằng cách đó bạn có một tách mã hiển thị xem và xem mã hành vi.

+0

Mã này hoạt động, nhưng tôi sẽ đưa lời khuyên của bạn và cố gắng để có kích hoạt javascript của cha mẹ khi trẻ trả về trạng thái thành công. Cảm ơn! – Alexandra

9

Cách tốt hơn là chuyển mime vào đối tượng HttpResponse.

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

Trong các phiên bản gần đây của django, 'mimetype' đã được thay thế bởi [' content_type'] (https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpResponse.__init__). Tuy nhiên, điều này dường như không hoạt động và tập lệnh hiển thị dưới dạng văn bản thuần túy thay vì thực thi. –

3

Chase của giải pháp làm việc cho tôi, mặc dù tôi cần phải thực hiện javascript hơn tôi quan tâm để đưa vào một chuỗi 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

Giải pháp này chạy tập lệnh và sau đó hiển thị văn bản thuần túy. Có giải pháp nào chỉ chạy tập lệnh và ở trên cùng một trang không? – sidpat

+0

@sidpat cũng cần thực hiện tương tự. Bạn đã tìm ra chưa? – Anupam

+0

@sidpat, tôi đã sử dụng window.location.href = đường dẫn/đến/hiện tại/trang trong js để quay lại cùng một trang và chạy js – Anupam

0

tôi đã kết thúc ở đây tìm kiếm một cách để phục vụ một tệp js động sử dụng django.

Đây là giải pháp của tôi:

return render(request, 'myscript.js', {'foo':'bar'}, 
         content_type="application/x-javascript") 
Các vấn đề liên quan