Resumo : neste tutorial, você aprenderá como usar a DeleteView
classe Django para definir uma visão baseada em classe que exclui um objeto existente.
Este tutorial começa onde o tutorial Django UpdateView parou.
Crie uma classe DeleteView do Django
A classe Django DeleteView
permite definir uma visão baseada em classe que exibe uma página de confirmação e exclui um objeto existente.
Se o método de solicitação HTTP for GET
, a
visualização exibirá a página de confirmação. Porém, se a solicitação for DeleteView
POST
, a
visualização excluirá o objeto.DeleteView
Para usar a DeleteView
classe, você define uma classe que herda dela e adiciona atributos e métodos para substituir os comportamentos padrão.
Por exemplo, o seguinte define uma TaskDelete
classe que exclui uma tarefa do aplicativo 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)
#...
Linguagem de código: Python ( python )
Neste exemplo, definimos a
classe que é uma subclasse da TaskDelete
DeleteView
classe. A
classe possui os seguintes atributos:TaskDelete
model
especifica a classe do modelo (Task
) que será excluída.
especifica o nome do objeto que será passado para o modelo. Por padrão, acontext_object_name
DeleteView
classe usa oobject
como nome. No entanto, você pode substituir o nome usando o
atributo.context_object_name
success_url
é o URL para o qual será redirecionado assim que o objeto for excluído com sucesso.
O método é chamado quando o objeto é excluído com sucesso. Neste exemplo, criamos uma mensagem flash.form_valid()
Por padrão, a DeleteView
classe usa o task_confirmation_delete.html
modelo se você não o especificar explicitamente.
Criando modelo task_confirm_delete.html
Crie um novo task_confirm_delete.html
modelo de arquivo no templates/todo
aplicativo com o seguinte código:
{%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%}
Linguagem de código: HTML, XML ( xml )
Estende task_confirm_delete.html
o base.html
modelo e contém um formulário que exclui uma tarefa.
Definindo uma rota
Defina uma nova rota no urls.py
que mapeia uma URL que exclui uma tarefa com o resultado do as_view()
método da TaskDelete
classe view:
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'),
]
Linguagem de código: Python ( python )
Incluindo um link para excluir uma tarefa
Modifique o task_list.html
modelo para adicionar um link que exclua uma tarefa para cada tarefa na lista de tarefas:
{%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%}
Linguagem de código: HTML, XML ( xml )
Se você clicar no botão excluir para excluir uma tarefa da lista, você receberá a seguinte página de confirmação de exclusão:
Clique no botão Excluir para excluir a tarefa do banco de dados e redirecioná-la de volta para a lista de tarefas:
Você pode baixar o código final deste tutorial do Django DeleteView aqui.
Resumo
- Use a classe Django
DeleteView
para definir uma visão baseada em classe que exclui um objeto existente.