Django 删除视图

创建 Django DeleteView 类

DjangoDeleteView类允许您定义基于类的视图,该视图显示确认页面并删除现有对象。

如果 HTTP 请求方法是GETDeleteView视图将显示确认页面。但是,如果请求是POSTDeleteView视图将删除该对象。

要使用该类DeleteView,您需要定义一个从它继承的类并添加属性方法来覆盖默认行为。

例如,下面定义了一个删除Todo 应用TaskDelete程序任务的类

#...
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)

#...
代码语言: Python python

在此示例中,我们定义了TaskDelete作为DeleteView类的子类的类。该类TaskDelete具有以下属性:

  • modelTask指定将被删除的模型 ( ) 的类。
  • context_object_name指定将传递给模板的对象名称。默认情况下,该类DeleteView使用object作为名称。但是,您可以使用属性覆盖名称context_object_name
  • success_url是成功删除对象后将重定向到的 URL。
  • form_valid()成功删除对象后调用方法。在这个例子中,我们创建了一个 flash 消息。

默认情况下,如果您未明确指定,该类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%}
代码语言: HTML、XML xml

扩展task_confirm_delete.html模板base.html并包含一个用于删除任务的表单。

定义路线

在 中定义一个新路由,该路由映射一个 URL,该 URL 使用视图类的方法urls.py的结果删除任务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'),
]
代码语言: Python python

包括删除任务的链接

修改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%}
代码语言: HTML、XML xml

如果您单击删除按钮删除列表中的任务,您将看到以下删除确认页面:

单击删除按钮将从数据库中删除任务并将其重定向回任务列表:

django 待办事项列表 - DeleteView 示例

您可以在此处下载此Django DeleteView 教程的最终代码

概括

  • 使用 DjangoDeleteView类定义删除现有对象的基于类的视图。
posted @ 2023-05-29 16:24  Oops!#  阅读(32)  评论(0编辑  收藏  举报