2015-03-19 6 views
11

Ich benutze Django integrierte DeleteView und ich habe einen Wert auf das success_url Attribut zugewiesen. Jetzt in meiner Vorlage, trigne ich diese Ansicht über JQuery '$ .post() -Methode. Wenn das Element gelöscht wird, werde ich nicht an die success_url weitergeleitet. Nach einiger Suche habe ich festgestellt, dass es ein Problem der AJAX Post-Methode scheint, die die Umleitung ignoriert.Umleiten nach AJAX Post in Django

Ich habe es behoben, indem ich eine Funktion hinzugefügt habe, um window.location="#myRedirectionURL" als dritten Parameter von $.post() in JQuery zu setzen.

Allerdings scheint dieser Weg nicht sehr Django. Im Wesentlichen löst es das Problem vom Aspekt von AJAX anstelle von Django. Außerdem ist die success_url in DeleteView nutzlos (Sie müssen aber immer noch success_url einen Wert zuweisen, sonst wird Django einen Fehler auslösen).

Also ist es der richtige Weg, um weitergeleitet zu werden, wenn Sie über AJAX posten? Gibt es einen besseren Weg?

Vielen Dank.

+0

Ich würde den 'location.href = '# myRedirectionURL'' js Code innerhalb der success_url Schablone mit einer' setTimeout' Verzögerung ausführen, während eine nette Mitteilung wie "das Löschen war okay" – abidibo

Antwort

12

Ajax wird Seiten nicht umleiten!

Was Sie von einer Weiterleitung erhalten, ist der HTML-Code von der neuen Seite innerhalb des Datenobjekts auf der POST-Antwort.

Wenn Sie wissen, wo der Benutzer umgeleitet werden, wenn alles, was Aktion fehlschlägt, können Sie einfach so etwas tun kann:

Auf dem Server

Falls Sie einen Fehler

response = {'status': 0, 'message': _("Your error")} 

Wenn alles gut gelaufen ist

response = {'status': 1, 'message': _("Ok")} # for ok 

Senden Sie die Antwort:

return HttpResponse(json.dumps(response), content_type='application/json') 

auf der HTML-Seite:

$.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') 
      } 
     }); 

Wenn Sie nicht wissen, wo der Benutzer zu senden, und Sie es vorziehen, dass die URL von dem Server zu erhalten, senden Sie einfach, dass als Parameter:

response = {'status': 0, 'message': _("Your error"), 'url':'your_url'} 

dann ersetzen, dass am Fenster Standort:

alert(data.message) 
// do your redirect 
window.location(data.url) 
+0

Sie haben es sehr deutlich für mich gemacht. Vielen Dank. Daher ist das Umleiten über AJAX-Codes (mit einem URL-Parameter in der JSON-Antwort von Django View, falls erforderlich) das einzige, um dieses Problem zu lösen, oder? Dann werde ich mich nicht unwohl fühlen. –

0

Vielleicht könnten Sie versuchen, die delete() -Methode des DeleteView überschrieben und verwenden Sie ein HttpResponseRedirect? Ich habe dies verwendet, um mehrere Löschungen in einer Transaktion durchzuführen, als ich das gleiche Problem mit get_success_url hatte, das ignoriert wurde. (Folgender Code nicht getestet - nur eine Idee, um als Ausgangspunkt zu dienen)

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

zeigte, aber die Ansicht asyncronous – abidibo

+0

genannt wird Ajax leitet Seiten nicht um. Sein asynchroner Aufruf. Wir müssen umleiten mit Js bei Erfolg von AJAX-Aufruf – kartheek

+0

Es muss immer noch eine Löschmethode ausführen, wie auch immer es aufgerufen wird. Sicherlich ist das der Sinn von DeleteView. – ElPedro

3

http://hunterford.me/how-to-handle-http-redirects-with-jquery-and-django/

diese funktioniert für mich, wie vielleicht

django Middleware

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

Danke Mixo! Es funktionierte.. – Sharath

0

django-Ajax ajaxPost für Umleitungen ermöglicht Hack sieht, wenn Sie eine normale Umleitung passieren (URL) dazu (als JSON-Antwort). Jquery ajax() Methoden haben in meinem Fall nicht funktioniert.