在Django中发布AJAX后重定向

我使用Django的内置DeleteView,并为success_url属性赋值。 现在在我的模板中,我通过JQuery’$ .post()方法触发此视图。 删除该项目时,我不会被重定向到success_url 。 经过一些搜索,我发现它似乎是AJAX post方法的一个问题,它忽略了重定向。

我通过添加一个函数来修复它,将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') } }); 

如果您不知道将用户发送到何处,并且您希望从服务器获取该URL,只需将其作为参数发送:

 response = {'status': 0, 'message': _("Your error"), 'url':'your_url'} 

然后将其替换为窗口位置:

  alert(data.message) // do your redirect window.location = data.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"); } }); }); 

也许你可以尝试覆盖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) 

django-ajax的ajaxPost允许重定向,如果你传递一个正常的重定向(URL)(作为一个json响应)。 Jquery ajax()方法在我的情况下不起作用。