在Django中进行AJAX提交后重定向

33
我使用Django内置的DeleteView,给success_url属性分配了一个值。现在在我的模板中,我通过JQuery的$.post()方法触发此视图。当项目被删除时,我没有被重定向到success_url。经过一些搜索,我发现这似乎是AJAX post方法的问题,它忽略了重定向。
我通过将一个函数添加为JQuery的$.post()的第三个参数来解决了这个问题,并设置window.location="#myRedirectionURL"
然而,这种方式似乎不太符合Django的风格。本质上,它从AJAX的角度解决了问题,而不是从Django的角度。此外,它使DeleteView中的success_url无用(但仍必须给success_url分配一个值,否则Django会引发错误)。
那么,通过AJAX提交后重定向是正确的方式吗?有更好的方法吗?
非常感谢。

我会在success_url模板中执行location.href='#myRedirectionURL' js代码,并设置一个setTimeout延迟,同时显示一个漂亮的消息,比如“删除成功”。 - abidibo
3个回答

39

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;

你已经对我讲得非常清楚了。非常感谢。那么,通过 AJAX 代码重定向(如果需要,在 Django 视图中使用 URL 参数的 JSON 响应)是解决这个问题唯一的方法,对吧?那我就不会感到不适了。 - Xiao Liang
我该如何将POST数据传递给我的视图?使用window.location='url',我只能调用一个URL,但无法发送应显示在URL中的自定义数据。 - Aseem
1
现在(Django 1.7以上版本),我们甚至可以使用JsonResponse来进一步简化响应行,虽然答案很好。 - Mazhar Zandsalimi

5

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

1
链接已经失效。以下是我如何让它工作的更多信息:1. 在settings.py中,在“MIDDLEWARE”下添加AjaxRedirect。2. 将继承类从object更改为MiddlewareMixin - John Pang
request.is_ajax() 已在 3.1 中被弃用。 - logicOnAbstractions

0

django-ajax的ajaxPost允许重定向,如果您将普通的重定向(URL)作为json响应传递给它。在我的情况下,Jquery ajax()方法无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接