在Django中的AJAX发布后重定向

Xia*_*ang 21 django ajax jquery redirect django-generic-views

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

我通过添加一个函数来修复它,将其设置window.location="#myRedirectionURL"$.post()JQuery中的第三个参数.

但是,这种方式似乎不是很Django.从本质上讲,它解决了AJAX方面的问题,而不是Django.更重要的是,它使success_urlDeleteView无用(但你还是要分配一个值success_url,否则Django会引发一个错误).

当你通过AJAX发布时,它是正确的重定向方式吗?有没有更好的方法呢?

非常感谢.

bru*_*tas 23

Ajax不会重定向页面!

从重定向获得的是POST响应中数据对象内新页面的html代码.

如果您知道在任何操作失败的情况下重定向用户的位置,您可以简单地执行以下操作:

在服务器上,

如果您有错误

response = {'status': 0, 'message': _("Your error")} 
Run Code Online (Sandbox Code Playgroud)

如果一切顺利

response = {'status': 1, 'message': _("Ok")} # for ok
Run Code Online (Sandbox Code Playgroud)

发送回复:

return HttpResponse(json.dumps(response), content_type='application/json')
Run Code Online (Sandbox Code Playgroud)

在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')
             }
        });
Run Code Online (Sandbox Code Playgroud)

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

response = {'status': 0, 'message': _("Your error"), 'url':'your_url'} 
Run Code Online (Sandbox Code Playgroud)

然后在窗口位置替换它:

 alert(data.message)
 // do your redirect
 window.location = data.url;
Run Code Online (Sandbox Code Playgroud)


mix*_*ixo 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
Run Code Online (Sandbox Code Playgroud)

javascript

$(document).ready(function() {
    $(document).ajaxComplete(function(e, xhr, settings) {
        if (xhr.status == 278) {
            window.location.href = xhr.getResponseHeader("Location");
        }
    });
});
Run Code Online (Sandbox Code Playgroud)