让Django的views.py返回并执行JavaScript

9

我正在使用django和文件上传相关的技术,我需要一个javascript函数在文件上传完成后执行。 我的views.py文件中有一个文件上传处理程序,代码如下:

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.")

我在http://djangosnippets.org/snippets/341/找到了一个Django代码片段,我将HttpJavascriptResponse类放入了我的views.py中。 代码如下:
class HttpJavascriptResponse(HttpResponse):
    def __init__(self,content):
       HttpResponse.__init__(self,content,mimetype="text/javascript")

然而,当我上传文件时,浏览器只是简单地在屏幕上呈现“parent.Response_OK();”,而不是实际执行JavaScript。Chrome 给出了警告:“资源被解释为文档,但 MIME 类型为 text/javascript”。是否有任何方法让 views.py 执行该脚本?
4个回答

12

5
在最近的Django版本中,mimetype已被content_type所替代。然而,这似乎并不起作用,脚本呈现为纯文本而非执行。 - Ryne Everett

6

我相信这会起作用。

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

然而,在这种情况下,您可能考虑返回成功(200)状态码,然后在父级中附加一些javascript,以便根据返回的状态码进行分支。这样,您就可以将视图渲染代码和视图行为代码分开。


代码可以运行,但我会采纳你的建议,尝试让父级JavaScript在子级返回成功状态时触发。谢谢! - Alexandra

3

我在这里寻求一种通过django提供动态js文件的方法。

以下是我的解决方案:

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

谢谢,这帮助了我通过添加 content_type。 - Laban

3

Chase的解决方案对我有用,尽管我需要执行更多的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
@sidpat 需要做同样的事情。你找到解决方法了吗? - Anupam
@sidpat,我在JS中使用window.location.href=path/to/current/page来返回相同的页面并运行JS。 - Anupam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接