Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Удаление (CRUD) Python: Разработка на фреймворке Django

Удаление – самое простое действие в обычном 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>

Зависимости

В реальной жизни удаление не такая простая операция. Обычно сущности не существуют сами по себе, у них есть зависимости. Например, у статьи есть комментарии, а у курса — уроки. Как должна вести себя система при удалении родительской сущности? Что делать с зависимостями?

Ответ будет разный для разных проектов и разных сущностей. Иногда нужно все удалить, иногда разорвать связи. В более сложных ситуациях удалять нельзя вообще. В таких случаях используется «мягкое удаление». При таком подходе сущность просто помечается как удаленная и не выводится на сайте, но всегда есть возможность ее восстановить.


Самостоятельная работа

  1. Реализуйте удаление
  2. Добавьте в список статей ссылку на удаление каждой статьи
  3. Попробуйте самостоятельно добавить вывод флеш-сообщений

Дополнительные материалы

  1. Работа со статикой

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 2 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»