2015-03-19 17 views
11

Uso il DeleteView integrato di Django e ho assegnato un valore all'attributo success_url. Ora nel mio modello, faccio scattare questa vista tramite il metodo $ .post() di JQuery. Quando l'elemento viene eliminato, non viene reindirizzato allo success_url. Dopo alcune ricerche, ho scoperto che sembra essere un problema del metodo di post AJAX, che ignora il reindirizzamento.Reindirizzamento dopo il post AJAX in Django

L'ho risolto aggiungendo una funzione per impostare lo window.location="#myRedirectionURL" come terzo parametro di $.post() in JQuery.

Tuttavia, questo modo sembra non molto Django. Essenzialmente, risolve il problema dall'aspetto di AJAX, invece di Django. Inoltre, lascia inutilizzato lo success_url in DeleteView (ma è comunque necessario assegnare un valore a success_url oppure Django genererà un errore).

Quindi è il modo giusto per essere reindirizzato quando si invia tramite AJAX? C'è un modo migliore per farlo?

Grazie mille.

+0

Eseguirò il codice js 'location.href = '# myRedirectionURL' all'interno del modello success_url, con un ritardo' setTimeout' mentre mostra un bel messaggio come' la cancellazione era ok ' – abidibo

risposta

12

Ajax non reindirizza le pagine!

Quello che ottieni da un reindirizzamento è il codice html della nuova pagina all'interno dell'oggetto dati nella risposta POST.

Se sai dove reindirizzare l'utente se qualsiasi azione non riesce, si può semplicemente fare qualcosa di simile:

Sul server,

Nel caso in cui si dispone di un errore

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

Se tutto è andato a posto

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

Invia la risposta:

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

sulla pagina 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') 
      } 
     }); 

Se non si sa dove mandare l'utente, e si preferisce ottenere tale URL dal server, basta inviare che come parametro:

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

quindi sostituire tale sulla posizione della finestra:

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

lo hai reso molto chiaro per me. Grazie mille. Quindi il reindirizzamento tramite i codici AJAX (con un parametro url nella risposta JSON dalla vista Django, se necessario) è l'unico a risolvere questo problema, giusto? Quindi non mi sentirò a disagio. –

0

Forse potresti provare a sovrascrivere il metodo delete() di DeleteView e utilizzare HttpResponseRedirect? Ho usato questo per fare più cancellazioni in una transazione quando ho avuto lo stesso problema con get_success_url essere ignorato. (Seguendo codice non testato - solo un'idea per agire come punto di partenza)

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

ma la vista è chiamata asincronicamente – abidibo

+0

Ajax non reindirizzerà le pagine La sua chiamata asincrona. abbiamo bisogno di reindirizzare utilizzando Js in caso di successo della chiamata AJAX – kartheek

+0

E 'comunque necessario eseguire un metodo di cancellazione, tuttavia viene chiamato. Sicuramente questo è il punto chiave di DeleteView. – ElPedro

3

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

questo funziona per me, forse sembra incidere

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 del

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

Grazie Mixo! Ha funzionato.. – Sharath

0

django-ajax ajaxPost permette di redirect se si passa un redirect normale (URL) ad esso (come risposta JSON). I metodi di Jquery ajax() non hanno funzionato nel mio caso.

Problemi correlati