2015-03-19 5 views
11

Я использую встроенный DeleteView Django, и я присвоил значение атрибуту success_url. Теперь в моем шаблоне я запускаю это представление с помощью метода JQuery '$ .post(). Когда элемент удален, я не перенаправляюсь на success_url. После некоторого поиска я обнаружил, что это проблема с методом AJAX post, который игнорирует перенаправление.Перенаправление после сообщения AJAX в Django

Я исправил его, добавив функцию, чтобы установить window.location="#myRedirectionURL" в качестве третьего параметра $.post() в JQuery.

Однако, этот способ кажется не очень Джанго. По сути, он решает проблему с точки зрения AJAX, а не Django. Более того, он оставляет success_url в DeleteView бесполезным (но вам еще нужно назначить значение success_url, или Django вызовет ошибку).

Так это правильный способ перенаправления при отправке через AJAX? Есть ли лучший способ сделать это?

Большое спасибо.

+0

Я бы выполнил код 'location.href = '# myRedirectionURL'' js внутри шаблона success_url с задержкой' setTimeout', показывая хорошее сообщение, например, «удаление было в порядке» – abidibo

ответ

12

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

вы сделали это очень ясно для меня. Большое спасибо. Таким образом, перенаправление через коды AJAX (с параметром url в ответе JSON из представления Django, если необходимо) является единственным решением этой проблемы, не так ли? Тогда я не буду чувствовать себя некомфортно с этим. –

0

Возможно, вы можете попробовать переопределить метод 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) 
+0

, но вид называется asyncronously – abidibo

+0

Ajax не будет перенаправлять страницы. Его асинхронный вызов. нам нужно перенаправить с помощью Js при успешном вызове AJAX – kartheek

+0

Ему все еще нужно запустить метод удаления, но он вызывается. Разумеется, в этом весь смысл DeleteView. – ElPedro

3

http://hunterford.me/how-to-handle-http-redirects-with-jquery-and-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 ajaxPost

$(document).ready(function() { 
    $(document).ajaxComplete(function(e, xhr, settings) { 
     if (xhr.status == 278) { 
      window.location.href = xhr.getResponseHeader("Location"); 
     } 
    }); 
}); 
+0

Спасибо Mixo! Это сработало.. – Sharath

0

Джанго-Аякса позволяет переадресовывает, если вы передаете обычный редирект (URL) к нему (как ответ json). В моем случае методы JQuery ajax() не работали.

Смежные вопросы