【问题标题】:Django: Issue with JSON and Internet ExplorerDjango:JSON 和 Internet Explorer 的问题
【发布时间】:2012-10-12 15:57:42
【问题描述】:

遇到 JSON 无法与 Internet Explorer (IE9) 一起使用的问题。 我已经在网上搜索了很多,并尝试了不同的解决方案,但似乎没有什么对我有用。所以认为是时候创建一个 SO 帐户并提出我的第一个问题了。

我正在使用 JSON 和 jQuery/AJAX 创建一个简单的上传进度指示器 该指标在 Firefox 和 Chrome 中运行良好

这是我的视图函数:

@never_cache
@admin_required
@render_to("editor/edit_file.html")
def edit_file(request, file_id=None):
    if file_id:
        try:
            file = Document.objects.get(pk=file_id)
            form = DocumentForm(request.POST or None, files=request.FILES or None, instance=file)
        except Document.DoesNotExist:
        form = DocumentForm(request.POST or None, files=request.FILES or None)
    else:
        dir_id = request.GET.get("dir")
        if dir_id:
            try:
                dir = Directory.objects.get(pk=dir_id)
                form = DocumentForm(request.POST or None, files=request.FILES or None, initial ={"directory":dir_id, "available_to":dir.available_to})
            except:
                form = DocumentForm(request.POST or None, files=request.FILES or None)
        else:
            form = DocumentForm(request.POST or None, files=request.FILES or None)

    result = {}
    response = locals()

    if request.method == "POST":
        if form.is_valid():
            file = form.save()
            result["status"] = "ok"
            result["href"] = reverse("portal.editor.views.files_list", args=[file.directory.pk])
            if not request.is_ajax():
                response = HttpResponseRedirect(reverse("portal.editor.views.files_list", args=[file.directory.pk]))
        else:
            result[status] = "error"
        if request.is_ajax():
            response = HttpResponse(json.dumps(result), mimetype="text/plain")
            add_never_cache_headers(response)
    return response

这是我的 jQuery 代码:

if ($("#id_edit_form").length > 0) {
    $("#id_edit_form").ajaxForm({
        type: "POST",
        cache: false,
        dataType: "json",
        beforeSubmit:  function (formData, jqForm, options) {
            $("#id_overlay").height($(document).height()).show();
        },
        success: function (response, status, xhr, $form) {
            $("#id_overlay").hide();
            if (status === "success") {
                if (response.status === "ok") {
                    location.href = response.href;
                } else if (response.status === "error") {
                    for (var item in response.form) {
                        $("#id_" + item).parent("p").next("p.js_form-error").html(response.form[item][0]);
                    }
                } else { alert(response.result); }
            } else { alert("Error status:", status); }
        }
    });
}

我觉得我已经尝试了一切。还尝试将 mimetype 更改为“text/plain”,但仍然无效。 我在 nginx 服务器上使用 Django 1.3、Python 2.6 和 jQuery 1.6.1。

nginx/mime.types 中的 mimetype 怎么样?我应该在这个文件中添加 json 吗? 我真的需要帮助,因为我一直因为这个问题而头疼!

提前致谢

【问题讨论】:

  • 请说明您观察到的具体内容(控制台中的错误消息等)。此外,您发布的 Python 代码在语法上无效,无法按原样工作。
  • 您应该发布您的解决方案作为答案并接受它。
  • 这不是我修复的问题本身,而是 Vasily 提到的语法错误
  • 你还没有描述你的问题。你说“它仍然没有工作”,但这是什么意思?您的代码有很多可能“不起作用”的方式。
  • 我似乎在 Fiddler 中找不到问题(也许我只是不知道去哪里找)。当用户上传文件时,会显示一个覆盖,直到上传完成。这在 Firefox 中运行顺利。然而,在 IE 中,覆盖在浏览器中“挂起”,这意味着它不会从 django 视图接收 JSON。模型已创建,文件已上传,但您必须刷新页面才能再次浏览。我已要求开发人员调查 Fiddler 中的错误。也许他能找到问题。

标签: jquery python django json internet-explorer-9


【解决方案1】:

语法错误可能是最后一个 } 之后的那个逗号

success:       function(response, status, xhr, $form){
            $("#id_overlay").hide();
                if( status == "success" ){
                    if( response.status == "ok"){
                        location.href = response.href;
                    }else
                    if(response.status == "error" ){
                        for(var item in response.form){
                            $("#id_"+item).parent("p").next("p.js_form-error").html(response.form[item][0]);
                        }
                    }else
                        alert(response.result);
                }else
                    alert("Error status:", status);
        },

最后一个逗号。 IE 对这类东西很挑剔。

我阅读了一些关于您正在使用的 ajaxForm 的信息。这是那个:http://malsup.com/jquery/form/?在我看来,您可以更轻松地使用它或完全忘记它并像这样使用 jquery ajax:

$('a.submit').live('click', function(event){
    event.preventDefault();
    var f = $(this).parents('form');
    data = f.serialize();
    if (contactIsWorking == false){
        $.ajax({
            'type':'POST',
            'url': '/contactform/',
            'data': data,
            'datatype':'json',
            'beforeSend':function(){
                contactIsWorking = true;
            },
            'success':function(data, textStatus){
                postHandler(f, data);
            },
            'error':function(jqXHR, textStatus, errorThrown){

            },
            'timeout':function(data){
            },
            'complete':function(data){
                contactIsWorking = false;
                spinner.fadeOut(500);
            }
        });
    }
});

从我的一个项目中快速获取此代码 - 它可能包含太多信息,但我想您可以过滤掉需要的内容

【讨论】:

  • 仅供参考,我还没有找到解决这个问题的方法。我还用 JSLint 浏览了我的 JS 代码,以修复任何可能干扰 IE 的东西,但仍然没有运气。 IE 是地狱的代码!
  • 您在成功回调后是否删除了逗号 } ? IE对这类东西很挑剔。
  • 是的,我做到了。我用新视图和 JS 编辑了我的帖子。我尝试了不同的内容类型(文本/纯文本、应用程序/json 等)。哪个是正确的使用?我应该在 js 代码中有一个“类型”吗?像 "typ": GET 或 "type": POST ?
  • 无需摆弄内容类型。保留dataType json,但是是的,您也应该在那里输入类型,因为对于jquery ajax (api.jquery.com/jQuery.ajax),默认类型是GET 而不是POST。如果那个逗号不是问题,那么 Ie 会引发什么样的错误?它通常至少提供一些关于什么是错误的信息
  • 它没有给我任何错误(不是像通常那样弹出任何带有 JavaScript 错误的弹出窗口)。似乎也无法在调试工具中找到错误 - 或者我只是不知道要查找什么。将尝试使用 type: POST 稍后,当我回家时
【解决方案2】:

仅供参考,当我升级到 Django 1.5 后,这个错误就消失了。

似乎 django 1.3 在 mimetypes/content-types 和 JSON 方面存在一些问题(现在我也使用内置 json 而不是 simplejson)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多