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发布时,正确的方法是重定向?有没有更好的方法来做到这一点?

非常感谢。

+0

我会在success_url模板内执行'location.href ='#myRedirectionURL'' js代码,并显示''删除正常'的好消息'setTimeout'延迟 – abidibo 2015-03-19 08:59:33

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) 
+0

你已经说清楚了。非常感谢你。因此,通过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) 
+0

但视图被异步调用 – abidibo 2015-03-19 09:37:07

+0

Ajax不会重定向页面的异步调用。我们需要在AJAX调用成功时使用Js进行重定向 – kartheek 2015-03-19 09:42:41

+0

它仍然需要运行删除方法,但是它被调用。当然,这就是DeleteView的重点。 – ElPedro 2015-03-19 09:43:36

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"); 
     } 
    }); 
}); 
+0

感谢Mixo!有效.. – Sharath 2016-02-09 09:33:13

Django的阿贾克斯ajaxPost允许重定向如果你通过一个正常的重定向(URL)(作为json响应)。 jquery ajax()方法在我的情况下不起作用。