2013-07-16 15 views
10

Jaki jest najlepszy sposób dodania przycisku "anuluj" do ogólnego widoku opartego na klasach w Django?Jak dodać przycisk anulowania do DeleteView w django

W poniższym przykładzie chciałbym, aby przycisk anulowania przeszedł do success_url bez usuwania obiektu. Próbowałem dodać do szablonu przycisk <input type="submit" name="cancel" value="Cancel" />. Mogę wykryć, czy przycisk ten został naciśnięty przez przesłonięcie metody post klasy AuthorDelete, ale nie mogę się dowiedzieć, jak przekierować stamtąd.

Przykład MojaApl/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) 

Przykład MojaApl/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> 

(Przykłady Adaptacja docs)

Odpowiedz

11

Twój podejście zastąpienie metody post i sprawdzenie, czy przycisk anulowania został naciśnięty, jest w porządku. Możesz przekierować, zwracając instancję 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) 

Użyłem get_success_url() za rodzajową, jego domyślna implementacja jest powrót self.success_url.

10

Dlaczego po prostu nie wstawiasz linku "Anuluj" do success_url zamiast przycisku? Zawsze możesz nadać mu styl CSS, aby wyglądał jak przycisk.

Ma to tę zaletę, że nie używa formularza POST do prostego przekierowania, co może dezorientować wyszukiwarki i łamać model WWW. Ponadto nie trzeba modyfikować kodu Python.

+0

To są dobre argumenty przemawiające za tym podejściem. Ale aby to zrobić, musiałbym dodać success_url do kontekstu szablonu, więc wciąż musiałbym trochę zmodyfikować kod Pythona. –

+2

@MichaelDunn Właściwie możesz uzyskać dostęp do adresu URL przez {{view.success_url}}, więc nie powinno być dodatkowego kodu Pythona – MatheusJardimB

1

przypadku korzystania CBV mogą uzyskać dostęp do view bezpośrednio z szablonu

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

Uwaga: należy do niego dostęp za pośrednictwem getter w przypadku, gdy został podklasy.

to zauważyć w kontekście ContextMixin docs

szablonu wszystkich klas ogólnych poglądów opartych obejmują view zmienną wskazującą na widok instancji.

Powiązane problemy