web-dev-qa-db-fra.com

Redirection après AJAX poste à Django

J'utilise la propriété intégrée DeleteView de Django et j'ai attribué une valeur à l'attribut success_url. Maintenant, dans mon modèle, je déclenche cette vue via la méthode $ .post () de JQuery. Lorsque l'élément est supprimé, je ne suis pas redirigé vers le success_url. Après quelques recherches, j’ai trouvé qu’il semblait y avoir un problème de méthode de postage [AJAX, qui ignore la redirection.

Je l'ai corrigé en ajoutant une fonction pour définir le window.location="#myRedirectionURL" comme troisième paramètre de $.post() dans JQuery.

Cependant, cette façon ne semble pas très Django. Essentiellement, cela résout le problème sous l’aspect AJAX, au lieu de Django. De plus, cela rend le success_url dans DeleteView inutile (vous devez néanmoins attribuer une valeur à success_url, sinon Django déclenchera une erreur). 

Alors, est-ce la bonne façon d’être redirigé lorsque vous publiez via AJAX? Y a-t-il une meilleure façon de le faire?

Merci beaucoup.

15
Xiao Liang

Ajax ne redirige pas les pages!

Ce que vous obtenez d'une redirection, c'est le code HTML de la nouvelle page à l'intérieur de l'objet de données dans la réponse POST.

Si vous savez où rediriger l'utilisateur si une action échoue, vous pouvez simplement faire quelque chose comme ceci:

Sur le serveur,

En cas d'erreur

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

Si tout s'est bien passé

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

Envoyez la réponse:

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

sur la page 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')
             }
        });

Si vous ne savez pas où envoyer l'utilisateur et si vous préférez obtenir cette URL du serveur, envoyez-la simplement en tant que paramètre:

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

puis substituez cela sur l'emplacement de la fenêtre:

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

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

Edit: source indisponible

celui-ci fonctionne pour moi, peut-être ressemble à bidouille

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

AjaxPost de Django-ajax permet les redirections si vous passez une redirection normale (URL) à celui-ci (sous forme de réponse json). Les méthodes ajax () de Jquery ne fonctionnaient pas dans mon cas.

0
Sergii Shcherbak