Django DeleteView

Resumo : neste tutorial, você aprenderá como usar a DeleteViewclasse 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 DeleteViewpermite 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 DeleteViewvisualização exibirá a página de confirmação. Porém, se a solicitação for POST, a DeleteViewvisualização excluirá o objeto.

Para usar a DeleteViewclasse, 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 TaskDeleteclasse 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 TaskDeleteclasse que é uma subclasse da DeleteViewclasse. A TaskDeleteclasse possui os seguintes atributos:

  • modelespecifica a classe do modelo ( Task) que será excluída.
  • context_object_nameespecifica o nome do objeto que será passado para o modelo. Por padrão, a DeleteViewclasse usa o objectcomo nome. No entanto, você pode substituir o nome usando o context_object_nameatributo.
  • success_urlé o URL para o qual será redirecionado assim que o objeto for excluído com sucesso.
  • form_valid()O método é chamado quando o objeto é excluído com sucesso. Neste exemplo, criamos uma mensagem flash.

Por padrão, a DeleteViewclasse usa o task_confirmation_delete.htmlmodelo se você não o especificar explicitamente.

Criando modelo task_confirm_delete.html

Crie um novo task_confirm_delete.htmlmodelo de arquivo no templates/todoaplicativo 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.htmlo base.htmlmodelo e contém um formulário que exclui uma tarefa.

Definindo uma rota

Defina uma nova rota no urls.pyque mapeia uma URL que exclui uma tarefa com o resultado do as_view()método da TaskDeleteclasse 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.htmlmodelo 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:

lista de tarefas do Django - exemplo DeleteView

Você pode baixar o código final deste tutorial do Django DeleteView aqui.

Resumo

  • Use a classe Django DeleteViewpara definir uma visão baseada em classe que exclui um objeto existente.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *