为什么我的jQuery.ajax响应与Django一起为空

时间:2009-08-26 12:02:04

标签: jquery ajax django responsetext

我正试图通过下面的ajax调用从Django视图调用返回JSON响应:

var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/"
}).responseText;

alert(response);

这是我的Django视图:

if request.is_ajax() == True:
    req = {}
    req['html'] = '<b>This is a test</b>'
    response = simplejson.dumps(req)
    print response
    return HttpResponse(response, mimetype="application/json")
else:
    return render_to_response("ajax/pingpong.html", {'ajax': ajax})

由于一些奇怪的原因,警告框是空白的(尽管它没有在其中说明未定义)。有趣的是,$ .post和$ .getJSON在完全相同的URL上工作正常。我还在控制台上看到了预期的JSON输出。任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:2)

您没有将dataType参数设置为json,并且您需要从success函数中获取json对象,请尝试以下操作:

var tab = 'test';
$.ajax({
    url: "/" + tab + "/",
    dataType: "json",
    success: function(json){
        alert(json);
    }        
});

答案 1 :(得分:1)

除非我弄错了,responseText不是$.ajax()返回的属性。我想你必须做这样的事情:

$.ajax({
  url: "/test",
  dataType: "json",
  success: function(data) {
    // use data
  }
});

由于dataType参数,产生回调的数据是普通的JS对象。如果您没有指定dataType,您将获得包含服务器返回的原始内容的字符串。

答案 2 :(得分:1)

虽然文档声称ResponseText将阻止浏览器直到请求完成,但在我看来,你正在获得竞争条件,即在XHR请求完成之前警告变量。你必须做这样的事情:

var complete = function(data) {
    console.log(response.responseText);
}
var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/",
    dataType: "json",
    success : complete
});

答案 3 :(得分:1)

请改为尝试:

var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/",
    success: function(data, textStatus) { alert(data); }
});

答案 4 :(得分:0)

我遇到了同样的问题,但仅限于特定的环境。我想知道你的问题是否相同。我的环境:

  1. 运行Django的内部网络服务器(./manage.py runserver 0.0.0.0:8080)
  2. 在Google Chrome浏览器中查看我的网站(v4.1.249.1025)。
  3. 在这种情况下,以下jQuery代码导致data = null,status =“success”大约一半时间。另一半时间它返回一个有效的数据对象。

    $.ajax({
       type:"POST",
       url:"response/"+q.id+"/",
       cache:false,
       dataType:"json",
       data:{response:$(this).val()},
       success:function(data, status) {
         alert(data+","+status);
       }, 
       error:function() {
         $(".main_container").text("Error. Please check your internet connection.");
       } 
    });