2013-07-16 9 views
10

Qual è il modo migliore per aggiungere un pulsante "annulla" a una vista generica basata su classi in Django?Come aggiungere un pulsante Annulla a DeleteView in django

Nell'esempio seguente, desidero il pulsante Annulla per portarti a success_url senza eliminare l'oggetto. Ho provato ad aggiungere un pulsante <input type="submit" name="cancel" value="Cancel" /> al modello. Sono in grado di rilevare se questo pulsante è stato premuto ignorando il metodo post della classe AuthorDelete, ma non riesco a capire come reindirizzare da lì.

Esempio myapp/views.py:

from django.views.generic.edit import DeleteView 
from django.core.urlresolvers import reverse_lazy 
from myapp.models import Author 

class AuthorDelete(DeleteView): 
    model = Author 
    success_url = reverse_lazy('author-list') 

    def post(self, request, *args, **kwargs): 
     if request.POST["cancel"]: 
      return ### return what? Can I redirect from here? 
     else: 
      return super(AuthorDelete, self).post(request, *args, **kwargs) 

Esempio myapp/author_confirm_delete.html:

<form action="" method="post">{% csrf_token %} 
    <p>Are you sure you want to delete "{{ object }}"?</p> 
    <input type="submit" value="Confirm" /> 
    <input type="submit" name="cancel" value="Cancel" /> 
</form> 

(Esempi adattato dal docs)

risposta

11

tuo approccio di sostituire il metodo post e controllare se il pulsante Annulla è stato premuto è ok. È possibile reindirizzare restituendo un'istanza HttpResponseRedirect.

from django.http import HttpResponseRedirect 

class AuthorDelete(DeleteView): 
    model = Author 
    success_url = reverse_lazy('author-list') 

    def post(self, request, *args, **kwargs): 
     if "cancel" in request.POST: 
      url = self.get_success_url() 
      return HttpResponseRedirect(url) 
     else: 
      return super(AuthorDelete, self).post(request, *args, **kwargs) 

ho usato get_success_url() ad essere generico, la sua attuazione default è di restituire self.success_url.

10

Perché non si inserisce semplicemente un collegamento "Annulla" su success_url anziché un pulsante? Puoi sempre modellarlo con i CSS per farlo apparire come un pulsante.

Questo ha il vantaggio di non utilizzare il modulo POST per il semplice reindirizzamento, che può confondere i motori di ricerca e interrompe il modello Web. Inoltre, non è necessario modificare il codice Python.

+0

Questi sono buoni argomenti per questo approccio. Ma per farlo dovrei aggiungere il success_url al contesto del template, quindi dovrei comunque modificare un po 'il codice Python. –

+2

@MichaelDunn In realtà è possibile accedere all'indirizzo URL tramite {{view.success_url}}, quindi non ci dovrebbe essere codice Python extra – MatheusJardimB

1

Se si utilizza CBV vi può accedere al view direttamente dal modello

<a href="{{ view.get_success_url }}" class="btn btn-default">Cancel</a> 

Nota: è necessario accedervi attraverso il getter nel caso in cui è stato sottoclasse.

Questo si segnala nel contesto ContextMixin docs

Il modello di tutte le viste generici basati su classi includono una variabile view che punta all'istanza View.

Problemi correlati