【发布时间】:2012-06-20 00:58:51
【问题描述】:
问题:我如何重定向到 django 中的页面,但将其“伪造”为 ajax 请求?
所以我有一个发布数据请求 - 通过 ajax (jQuery) 完成。这会发送到我的 django 服务器,它会添加数据(或删除数据!),然后以“干得好,您添加了一些数据”页面作为响应。
这个成功页面的开头是:
{% extends request.is_ajax|yesno:"base_ajax.htm,base.htm" %}
如果请求不是 ajax 请求,这是添加各种标头的好方法,如果是则忽略标头。我添加了这个,以便该网站在使用和不使用 javascript 的情况下都可以工作(我们还需要这样做吗?)
然后我添加了一个post-redirect-get(即视图的post部分不是return render_to_response而是return redirect('url here')
现在的问题是重定向忘记了初始请求是一个 ajax 请求。所以我总是最终将整个页面 - 标题和所有 - 加载到一个 div 中,这不是我想要的。
所以,我希望能够告诉重定向它应该伪装成一个 ajax 请求
我该怎么做?
更新:对于在“未来(使用喷气背包!)”中阅读此内容的任何人,重定向不会携带标头信息 - 请参阅 https://www.rfc-editor.org/rfc/rfc2616#section-7.1
最后,我做到了:
return redirect(self.success_redirect + '/' + str(int(request.is_ajax())))
然后,对于我重定向到的视图,我有:
url(r'^editStorySuccess/(?P<ajax>\d+)$',
showAfterCheckingAjax,
{
'template':'stories/editStorySuccess.html'
},
'editStorySuccess'
),
在 showAfterCheckingAjax 视图中我刚刚拥有:
if int(ajax):
request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
return render_to_response(template, {'user':request.user},
context_instance=RequestContext(request))
这对我有用!
【问题讨论】:
-
ajax 请求只是一个普通的 http 请求,加上浏览器插入的任何额外的标头以将其标记为 ajax。没有根本区别。添加这些标题,然后繁荣,它是“ajax”。
-
如果您打算使用 Ajax 提交数据,使用 PRG 模式并不是很有用,因此您可能希望返回实际响应而不是重定向。
标签: python ajax django redirect