Django中的AJAX后发送重定向
我使用Django的内置DeleteView,并为success_url
属性分配了一个值。现在在我的模板中,我通过JQuery的$ .post()方法触发这个视图。当该项目被删除时,我不会被重定向到success_url
。经过一番搜索之后,我发现它似乎是一个AJAX post方法的问题,它忽略了重定向。Django中的AJAX后发送重定向
我通过添加一个函数来设置window.location="#myRedirectionURL"
作为JQuery中$.post()
的第三个参数来修复它。
但是,这种方式似乎不是很Django。从本质上讲,它从AJAX的角度解决了问题,而不是Django。更重要的是,它使DeleteView中的success_url
无用(但您仍然必须为success_url
指定一个值,否则Django会引发错误)。
那么当您通过AJAX发布时,正确的方法是重定向?有没有更好的方法来做到这一点?
非常感谢。
Ajax不会重定向页面!
您从重定向中获得的是POST响应中数据对象内新页面的html代码。
如果你知道去哪里,如果任何操作失败将用户重定向,你可以简单地做这样的事情:
在服务器上,
如果你有一个错误
response = {'status': 0, 'message': _("Your error")}
如果一切正常
response = {'status': 1, 'message': _("Ok")} # for ok
发送回复:
return HttpResponse(json.dumps(response), content_type='application/json')
HTML页面上
:
$.post("{% url 'your_url' %}",
{ csrfmiddlewaretoken: '{{ csrf_token}}' ,
other_params: JSON.stringify(whatever)
},
function(data) {
if(data.status == 1){ // meaning that everyhting went ok
// do something
}
else{
alert(data.message)
// do your redirect
window.location('your_url')
}
});
如果你不知道从哪里发送用户,并且您希望从服务器获取该网址,只需发送,作为一个参数:
response = {'status': 0, 'message': _("Your error"), 'url':'your_url'}
则替换,关于窗口的位置:
alert(data.message)
// do your redirect
window.location(data.url)
你已经说清楚了。非常感谢你。因此,通过AJAX代码重定向(必要时在Django视图中使用JSON响应中的url参数)是解决此问题的唯一方法,对吗?然后我不会觉得不舒服。 – 2015-03-19 20:39:47
也许你可以尝试覆盖DeleteView的delete()方法并使用HttpResponseRedirect?当我在get_success_url被忽略时遇到同样的问题时,我使用它在一个事务中执行了多个删除操作。 (以下代码未经测试 - 只是作为起点的想法)
class DeleteRecord(views.DeleteView) :
model = models.Record
def delete(self, request, *args, **kwargs) :
super(DeleteRecord, self).delete(*args, **kwargs)
url = "http://whatever.your.url.is"
return HttpResponseRedirect(url)
http://hunterford.me/how-to-handle-http-redirects-with-jquery-and-django/
这个工作对我来说,也许看起来像黑客
Django的中间件
from django.http import HttpResponseRedirect
class AjaxRedirect(object):
def process_response(self, request, response):
if request.is_ajax():
if type(response) == HttpResponseRedirect:
response.status_code = 278
return response
的JavaScript
$(document).ready(function() {
$(document).ajaxComplete(function(e, xhr, settings) {
if (xhr.status == 278) {
window.location.href = xhr.getResponseHeader("Location");
}
});
});
感谢Mixo!有效.. – Sharath 2016-02-09 09:33:13
Django的阿贾克斯ajaxPost允许重定向如果你通过一个正常的重定向(URL)(作为json响应)。 jquery ajax()方法在我的情况下不起作用。
我会在success_url模板内执行'location.href ='#myRedirectionURL'' js代码,并显示''删除正常'的好消息'setTimeout'延迟 – abidibo 2015-03-19 08:59:33