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)
答案 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)
您可能需要更改一些内容:
您似乎正在使用jQuery进行AJAX调用。如果是这种情况,那么您不需要手动添加任何标头以使服务器认为它是一个AJAX调用,因为jQuery会自动执行此操作。
在您视图的request.is_ajax
区块中,您正在呼叫Users.objects.all()
(请注意s
上的Users
)User.objects.all()
但else
{ {1}}阻止,因此您可能遇到的问题可能是因为对Users
的呼叫无效。
我还建议您使用浏览器中提供的请求检查工具来检查请求标头,这些标头会显示所有内容是否正确形成。
除了error
之外,您还应在AJAX请求选项中添加success
回调,这样您就可以获得有关请求失败时失败的更多信息。