2014-07-19 58 views
0

对Ajax不熟悉,所以我试图让我的头部缠绕在东西上。我试图通过将我的Javascript事件处理程序连接到span元素的onclick来进行Ajax调用。我的模板中没有表单元素。是否有可能在Django中没有表单元素的情况下进行Ajax调用?从我的理解是,但我似乎无法让它工作。当我在视图中查看请求时,没有HTTP_X_REQUESTED_WITH标头,因此request.is_ajax()调用始终返回false。在没有表格的情况下在Django中调用Ajax

这里是我的模板的相关部分:

<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td> 

这是我的JavaScript函数:

function sort_user_table(col_name) { 
    $.ajax({ 
    url: "/listusers/", 
    data: {sort_order: col_name}, 
    headers: {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}, 
    type: "GET", 
    dataType : "json", 
    success: function(json) { 
     alert('json = ' + json); 
    }, 
    }); 
} 

这是我的观点:

def list_users_page(request): 
    if request.is_ajax(): 
    sort_order = request.GET['sort_order'] 
    users = User.objects.all().order_by(sort_order) 
    data = serializers.serialize('json', users) 
    json_users = json.dumps(data) 
    return HttpResponse(json_users, mimetype='application/json') 
    else: 
    users = User.objects.all().order_by('last_name') 
    variables = RequestContext(request, { 
     'users': users, 
    }) 
    return render_to_response('users_page.html', variables) 

回答

1

好吧,所以我想清楚发生了什么事。我在发布我的模板代码时犯了一个错误,因此它没有完成(我试图简短一些,但最后却忽略了一个重要的信息)。以下是真实代码的样子:

<td><span class="header" onclick="sort_user_table('username')"><a href="">Username</a></span></td> 

href是导致此问题的原因。由于它实际上是一个链接,因此当我点击用户名span元素时,正在对新资源发出请求。因此,虽然JavaScript代码正在执行,但它实际上并不是一个Ajax请求,而是一个简单的HTTP请求。如果我只是从span元素中删除href,则一切都按预期工作。 HTTP_X_REQUESTED_WITH头被发送,我的Django视图响应为request.is_ajax()

0

有几件事情你可能需要更改:

  1. 它看起来像你使用jQuery来进行AJAX调用。如果是这样的话,那么你不需要手动添加任何头文件来让服务器认为它是一个AJAX调用,因为jQuery会自动执行该调用。

  2. 在你看来,你在呼唤Users.objects.all()request.is_ajax块(注意尾随sUsers),但User.objects.all()else块,所以有可能你碰到了问题,是因为一个无效的调用Users的。

我也建议使用浏览器可请求检查工具检查请求头,如果是正确形成的一切,它会显示你的。

除了success之外,您还应该在您的AJAX请求选项中添加一个error回调函数,以便您可以获取有关失败请求的更多信息。

+0

感谢您的建议。 'request.is_ajax'块中的'Users'是一个错字,我的代码确实是'User.objects.all'。为了简洁,我省略了错误回调。当我插入并检查错误时,它仅仅是“错误”消息,不是很有帮助。我按照你的建议做了,并检查了请求标题,HTTP_X_REQUESTED_WITH标题不在请求中。 – nucklehedd

相关问题