在 Django AJAX post 之后重定向
Redirecting after AJAX post in Django
我使用 Django 的内置 DeleteView 并为 success_url
属性分配了一个值。现在在我的模板中,我通过 JQuery' $.post() 方法触发此视图。当项目被删除时,我不会被重定向到 success_url
。搜索了一下,发现好像是AJAXpost方法的问题,忽略了重定向
我通过添加一个函数来修复它,将 window.location="#myRedirectionURL"
设置为 JQuery 中 $.post()
的第三个参数。
不过,这种方式似乎不太适合Django。本质上是从AJAX的角度解决问题,而不是Django。更重要的是,它使 DeleteView 中的 success_url
无用(但您仍然必须为 success_url
分配一个值,否则 Django 将引发错误)。
那么当您 post 通过 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'}
然后将其替换为 window 位置:
alert(data.message)
// do your redirect
window.location = data.url;
http://hunterford.me/how-to-handle-http-redirects-with--jquery-and-django/
编辑:来源不可用
这个对我有用,可能看起来像 hack
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");
}
});
});
django-ajax 的 ajaxPost 允许重定向,如果你传递一个正常的重定向(URL)给它(作为 json回复)。 Jquery ajax() 方法在我的案例中不起作用。
我使用 Django 的内置 DeleteView 并为 success_url
属性分配了一个值。现在在我的模板中,我通过 JQuery' $.post() 方法触发此视图。当项目被删除时,我不会被重定向到 success_url
。搜索了一下,发现好像是AJAXpost方法的问题,忽略了重定向
我通过添加一个函数来修复它,将 window.location="#myRedirectionURL"
设置为 JQuery 中 $.post()
的第三个参数。
不过,这种方式似乎不太适合Django。本质上是从AJAX的角度解决问题,而不是Django。更重要的是,它使 DeleteView 中的 success_url
无用(但您仍然必须为 success_url
分配一个值,否则 Django 将引发错误)。
那么当您 post 通过 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'}
然后将其替换为 window 位置:
alert(data.message)
// do your redirect
window.location = data.url;
http://hunterford.me/how-to-handle-http-redirects-with--jquery-and-django/
编辑:来源不可用
这个对我有用,可能看起来像 hack
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");
}
});
});
django-ajax 的 ajaxPost 允许重定向,如果你传递一个正常的重定向(URL)给它(作为 json回复)。 Jquery ajax() 方法在我的案例中不起作用。