2013-07-16 4 views
10

Каков наилучший способ добавить кнопку «Отменить» к универсальному представлению на основе классов в Django?Как добавить кнопку отмены в DeleteView в django

В приведенном ниже примере я хотел бы, чтобы кнопка отмены достала вас до success_url без удаления объекта. Я попытался добавить в шаблон кнопку <input type="submit" name="cancel" value="Cancel" />. Я могу определить, была ли эта кнопка нажата, переопределив метод post класса AuthorDelete, но я не могу решить, как перенаправлять оттуда.

Пример 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) 

Пример 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> 

(примеры, адаптированные из docs)

ответ

11

Ваш подход переопределения метода post и проверить, нажата ли кнопка отмены, в порядке. Вы можете перенаправить, вернув экземпляр 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) 

Я использовал get_success_url() быть универсальным, его реализация по умолчанию является возвращение self.success_url.

10

Почему бы вам просто не поместить ссылку «Отменить» на success_url вместо кнопки? Вы всегда можете создать стиль с помощью CSS, чтобы он выглядел как кнопка.

Это имеет то преимущество, что не использует форму POST для простого перенаправления, что может смутить поисковые системы и разбить веб-модель. Кроме того, вам не нужно изменять код Python.

+0

Это хороший аргумент в пользу такого подхода. Но для этого мне пришлось бы добавить success_url в контекст шаблона, поэтому мне все равно придется немного изменить код python. –

+2

@MichaelDunn На самом деле вы можете получить адрес URL через {{view.success_url}}, поэтому не должно быть дополнительного кода на Python – MatheusJardimB

1

При использовании ОЦК-х вы можете получить доступ к view непосредственно из шаблона

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

Примечание: вы должны получить доступ к нему через геттер в случае, если он был подклассы.

Это отмечено в контекст ContextMixin docs

Шаблон всех общих взглядов на основе классов включают в себя view переменную, которая указывает на View, например.

Смежные вопросы