Класс Django DeleteView в в Python — использование на примерах

Класс Django DeleteView используется для определения представления на основе класса, которое удаляет существующий объект в Python.

Содержание

Создание класса 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 удалит задачу из базы данных и перенаправит ее обратно в список задач:

список задач django - пример DeleteView

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *