【问题标题】:Ajax call in Django without a form没有表单的Django中的Ajax调用
【发布时间】:2014-07-19 03:28:27
【问题描述】:

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)

【问题讨论】:

    标签: javascript jquery ajax django


    【解决方案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() 响应为 true。

    【讨论】:

      【解决方案2】:

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

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

      2. 在您的视图的request.is_ajax 块中,您正在调用Users.objects.all()(注意Users 上的尾随s)但User.objects.all() 在您的else 块中,因此您可能遇到问题'正在获取是因为对 Users 的无效调用。

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

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

      【讨论】:

      • 感谢您的建议。 request.is_ajax 块中的 Users 是一个错字,我的代码确实是 User.objects.all。为简洁起见,我省略了错误回调。当我插入它并检查错误时,它只是消息“错误”,不是很有帮助。我按照您的建议做了并检查了请求标头,并且请求中不存在 HTTP_X_REQUESTED_WITH 标头。
      猜你喜欢
      • 2017-12-26
      • 2018-10-29
      • 2011-12-22
      • 2012-02-22
      • 1970-01-01
      • 2015-02-03
      • 2013-08-07
      • 2012-11-09
      相关资源
      最近更新 更多