Класс Django DeleteView в в Python — использование на примерах
Класс Django DeleteView используется для определения представления на основе класса, которое удаляет существующий объект в Python.
- Создание класса Django DeleteView
- Создание шаблона task_confirm_delete.html
- Определение маршрута
- Включая ссылку для удаления задачи
Создание класса Django DeleteView
Класс Django DeleteView позволяет определить представление на основе класса, которое отображает страницу подтверждения и удаляет существующий объект.
Если метод HTTP-запроса — GET, то представление DeleteView отобразит страницу подтверждения. Однако если запрос — POST, то представление DeleteView удалит объект.
Чтобы использовать класс DeleteView, необходимо определить класс, который наследует его, и добавить атрибуты и методы для переопределения поведения по умолчанию.
Например, ниже определяется класс TaskDelete, который удаляет задачу для приложения Todo:
#... from django.views.generic.edit import DeleteView, CreateView, UpdateView from django.contrib import messages from django.urls import reverse_lazy from .models import Task class TaskDelete(DeleteView): model = Task context_object_name = 'task' success_url = reverse_lazy('tasks') def form_valid(self, form): messages.success(self.request, "The task was deleted successfully.") return super(TaskDelete,self).form_valid(form) #...
В этом примере мы определяем класс TaskDelete, который является подклассом класса DeleteView. Класс TaskDelete имеет следующие атрибуты:
- model указывает класс модели (Task), которая будет удалена.
- context_object_name указывает имя объекта, которое будет передано в шаблон. По умолчанию класс DeleteView использует объект в качестве имени. Однако вы можете переопределить имя с помощью атрибута context_object_name.
- success_url — URL-адрес, на который будет выполнено перенаправление после успешного удаления объекта.
- Метод form_valid() вызывается после успешного удаления объекта. В этом примере мы создаем флэш-сообщение.
По умолчанию класс DeleteView использует шаблон task_confirmation_delete.html, если вы не указали его явно.
Создание шаблона task_confirm_delete.html
Создайте новый файл-шаблон task_confirm_delete.html в приложении templates/todo со следующим кодом:
{%extends 'base.html'%} {%block content%} <div class="center"> <form method="post" class="card"> {% csrf_token %} <h2>Delete Task</h2> <p>Are you sure that you want to delete "{{task}}"?</p> <p class="form-buttons"> <input type="submit" class="btn btn-primary" value="Delete"> <a href="{% url 'tasks'%}" class="btn btn-outline">Cancel</a> </p> </form> </div> {%endblock content%}
Task_confirm_delete.html расширяет шаблон base.html и содержит форму, которая удаляет задачу.
Определение маршрута
Определите новый маршрут в urls.py, который сопоставляет URL-адрес, удаляющий задачу, с результатом метода as_view() класса представления TaskDelete:
from django.urls import path from .views import( home, TaskList, TaskDetail, TaskCreate, TaskUpdate, TaskDelete ) urlpatterns = [ path('', home, name='home'), path('tasks/', TaskList.as_view(),name='tasks'), path('task/<int:pk>/', TaskDetail.as_view(),name='task'), path('task/create/', TaskCreate.as_view(),name='task-create'), path('task/update/<int:pk>/', TaskUpdate.as_view(),name='task-update'), path('task/delete/<int:pk>/', TaskDelete.as_view(),name='task-delete'), ]
Включая ссылку для удаления задачи
Измените шаблон task_list.html, чтобы добавить ссылку, удаляющую задачу, к каждой задаче в списке задач:
{%extends 'base.html'%} {%block content%} <div class="center"> <h2>My Todo List</h2> {% if tasks %} <ul class="tasks"> {% for task in tasks %} <li><a href="{% url 'task' task.id %}" class="{% if task.completed%}completed{%endif%}">{{ task.title }}</a> <div class="task-controls"> <a href="{%url 'task-delete' task.id %}"><i class="bi bi-trash"></i> </a> <a href="{%url 'task-update' task.id %}"><i class="bi bi-pencil-square"></i></a> </div> </li> {% endfor %} {% else %} <p>🎉 Yay, you have no pending tasks! <a href="{%url 'task-create'%}">Create Task</a></p> {% endif %} </ul> </div> {%endblock content%}
Если вы нажмете кнопку delete, чтобы удалить задачу из списка, вы увидите следующую страницу подтверждения удаления:
Нажатие кнопки delete удалит задачу из базы данных и перенаправит ее обратно в список задач: