Перенаправление после сообщения AJAX в Django
Я использую встроенный DeleteView Django, и я назначил значение . Теперь в моем шаблоне я запускаю это представление через JQuery'$.метод post. Когда элемент удален, я не перенаправляюсь на success_url
. После некоторого поиска я обнаружил, что это, похоже, проблема метода AJAX post, который игнорирует перенаправление.
я исправил это, добавив функцию для установки window.location="#myRedirectionURL"
в качестве третьего параметра $.post()
в JQuery.
однако, этот путь кажется, не очень Джанго. По сути, он решает проблему с точки зрения AJAX, а не Django. Более того, он оставляет success_url
в DeleteView бесполезно (но вам все равно нужно присвоить значение success_url
, или Django вызовет ошибку).
так это правильный способ перенаправляться при публикации через AJAX? Есть ли лучший способ сделать это?
большое спасибо.
4 ответов
Ajax не будет перенаправлять страницы!
то, что вы получаете от перенаправления, - это html-код с новой страницы внутри объекта данных в ответе POST.
если вы знаете, куда перенаправить пользователя, если какое-либо действие не удается, вы можете просто сделать что-то вроде этого:
на сервере
в случае, если у вас ошибка
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/
это работает для меня, возможно, выглядит как 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");
}
});
});
может быть, вы могли бы попробовать переопределить метод delete () DeleteView и использовать 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)
ajaxPost django-ajax позволяет перенаправлять, если вы передаете ему обычное перенаправление (URL) (как ответ json). Методы jQuery ajax () не работали в моем случае.