Удаление – самое простое действие в обычном CRUD. Ему не нужен шаблон. Удаление состоит из простого обработчика, в котором нет условных конструкций. В этом уроке научимся правильно удалять сущности.
Для удаления сущности, нужно добавить новые маршрут и обработчик:
Маршрут
from django.urls import path
from hexlet_django_blog.article.views import IndexView, ArticleFormView, ArticleFormEditView, ArticleFormDeleteView
urlpatterns = [
# ...
path('<int:id>/delete/', ArticleFormDeleteView.as_view(), name='articles_delete'),
]
Обработчик
class ArticleFormDeleteView(View):
def post(self, request, *args, **kwargs):
article_id = kwargs.get('id')
article = Article.objects.get(id=article_id)
if article:
article.delete()
return redirect('articles')
Самое интересное в удалении – это ссылка или кнопка удаления. Она не может быть обычной ссылкой. С точки зрения HTTP, удаление — это DELETE-запрос. Эту семантику важно соблюдать, так как на нее ориентируются разные инструменты и поисковики при анализе страниц.
Django, как и большинство python фреймворков, принимает данные через GET или POST запросы. Для обработки таких запросов как DELETE или PATCH используются маршруты, содержащие в себе название действия и привязанные к соответствующим обработчикам POST запросов.
Но если сделать удаление обычной ссылкой, то любой автоматический инструмент может попробовать перейти по ней, например, предзагрузка страниц в Chrome. Это будет крайне неприятный сюрприз.
Чтобы решить подобную проблему, сделаем ссылку на удаление формой:
<form action="{% url 'articles_delete' article.id %}" method="post">
{% csrf_token %}
<input type="submit" value="Удалить">
</form>
Зависимости
В реальной жизни удаление не такая простая операция. Обычно сущности не существуют сами по себе, у них есть зависимости. Например, у статьи есть комментарии, а у курса — уроки. Как должна вести себя система при удалении родительской сущности? Что делать с зависимостями?
Ответ будет разный для разных проектов и разных сущностей. Иногда нужно все удалить, иногда разорвать связи. В более сложных ситуациях удалять нельзя вообще. В таких случаях используется «мягкое удаление». При таком подходе сущность просто помечается как удаленная и не выводится на сайте, но всегда есть возможность ее восстановить.
Самостоятельная работа
- Реализуйте удаление
- Добавьте в список статей ссылку на удаление каждой статьи
- Попробуйте самостоятельно добавить вывод флеш-сообщений
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.