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