Django 删除视图
创建 Django DeleteView 类
DjangoDeleteView
类允许您定义基于类的视图,该视图显示确认页面并删除现有对象。
如果 HTTP 请求方法是GET
,DeleteView
视图将显示确认页面。但是,如果请求是POST
,DeleteView
视图将删除该对象。
要使用该类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
具有以下属性:
model
Task
指定将被删除的模型 ( ) 的类。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
类定义删除现有对象的基于类的视图。