没有表单的Ajang在Django中调用

时间:2014-07-19 03:28:27

标签: javascript jquery ajax django

Ajax的新手,所以我试图让我的脑袋缠绕在一起。我正在尝试通过将我的Javascript事件处理程序连接到一个span元素的onclick来进行Ajax调用。我的模板中没有表单元素。是否可以在Django中没有表单元素的情况下进行Ajax调用?据我所知,但我似乎无法让它发挥作用。当我在视图中查看请求时,没有HTTP_X_REQUESTED_WITH标头,因此request.is_ajax()调用始终返回false。

以下是我的模板的相关部分:

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

2 个答案:

答案 0 :(得分:1)

好的,所以我弄清楚发生了什么。我在发布模板代码时犯了一个错误,所以它不完整(我试图简短,但最终遗漏了一个重要的信息)。这是真正的代码片段:

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

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

答案 1 :(得分:0)

您可能需要更改一些内容:

  1. 您似乎正在使用jQuery进行AJAX调用。如果是这种情况,那么您不需要手动添加任何标头以使服务器认为它是一个AJAX调用,因为jQuery会自动执行此操作。

  2. 在您视图的request.is_ajax区块中,您正在呼叫Users.objects.all()(请注意s上的UsersUser.objects.all()else { {1}}阻止,因此您可能遇到的问题可能是因为对Users的呼叫无效。

  3. 我还建议您使用浏览器中提供的请求检查工具来检查请求标头,这些标头会显示所有内容是否正确形成。

    除了error之外,您还应在AJAX请求选项中添加success回调,这样您就可以获得有关请求失败时失败的更多信息。