web-dev-qa-db-de.com

Weiterleitung nach AJAX Beitrag in Django

Ich verwende Djangos eingebaute DeleteView und habe dem success_url-Attribut einen Wert zugewiesen. Jetzt stelle ich diese Ansicht in meiner Vorlage über die JQuery-Methode $ .post () aus. Wenn das Element gelöscht wird, werde ich nicht zum success_url weitergeleitet. Nach einiger Suche stellte ich fest, dass es sich um ein Problem der Postmethode AJAX handelt, die die Weiterleitung ignoriert.

Ich habe es behoben, indem ich eine Funktion hinzufügte, um den window.location="#myRedirectionURL" als dritten Parameter von $.post() in JQuery festzulegen.

Dieser Weg scheint jedoch nicht sehr Django zu sein. Im Wesentlichen löst es das Problem aus der Sicht von AJAX anstelle von Django. Darüber hinaus bleibt der success_url in DeleteView unbrauchbar (Sie müssen jedoch success_url einen Wert zuweisen, da Django einen Fehler auslöst). 

Ist es also der richtige Weg, um weitergeleitet zu werden, wenn Sie über AJAX posten? Gibt es eine bessere Möglichkeit, dies zu tun?

Vielen Dank.

15
Xiao Liang

Ajax leitet Seiten nicht um!

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

Wenn Sie wissen, wohin der Benutzer umgeleitet werden soll, falls die Aktion fehlschlägt, können Sie einfach Folgendes tun:

Auf dem Server

Falls Sie einen Fehler haben

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

Wenn alles gut ging

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, wohin der Benutzer gesendet werden soll, und Sie diese URL lieber vom Server erhalten möchten, senden Sie diese einfach als Parameter:

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

dann ersetzen Sie das auf der Fensterposition:

 alert(data.message)
 // do your redirect
 window.location = data.url;
17
brunofitas

http://hunterford.me/how-to-handle-http-redirects-mit--jquery-and-Django/

Bearbeiten: Quelle nicht verfügbar

dieser arbeitet für mich, sieht vielleicht aus wie ein hack

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");
        }
    });
});
4
mixo

AjangPost von Django-ajax erlaubt Weiterleitungen, wenn Sie eine normale Weiterleitung (URL) an ihn übergeben (als Json-Antwort). Jquery ajax () -Methoden haben in meinem Fall nicht funktioniert.

0