📌  相关文章
📜  DeleteView - 基于类的视图 Django(1)

📅  最后修改于: 2023-12-03 14:40:42.119000             🧑  作者: Mango

DeleteView - 基于类的视图 Django

DeleteView是Django中一个基于类的视图,在视图中实现删除操作,它继承自BaseDetailView和BaseDeleteView。DeleteView将删除视图和确认页面组合成一个视图,因此可以在一些项目中比较方便的使用。在下面的文章中我们将详细介绍DeleteView的用法。

用法

在删除一个对象时我们需要完成两次请求,第一次进行提交数据的操作,第二次进行确认,具体的步骤如下:

第一步: 创建DeleteView类

我们可以在Django中创建一个DeleteView类的子类,该子类将删除模型实例并返回一个指定的成功页面。下面是一个简单的例子。

from django.views.generic.edit import DeleteView
from django.urls import reverse_lazy
from.models import YourModel

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')

在上述代码中,我们使用了DeleteView这个类并指定了模型和成功页面。如果要使用其他选项,请参考Django文档。

第二步: 创建删除确认模板

如果需要删除对象之前确认的视图,则需要创建html模板。下面是一个简单的例子。

{% extends "base.html" %}

{% block content %}
  <h2>Confirm deletion of {{ object }}</h2>
  <form method="post">
    {% csrf_token %}
    <p>Are you sure you want to delete this object?</p>
    <input type="submit" value="Confirm">
  </form>
{% endblock %}

在上面的代码片段中,我们使用了Django的csrf_token来保护表单,该表单使用了POST方法。

第三步: 定义URLconf

在urls.py中为我们的删除视图定义一个URLconf。

from django.urls import path
from .views import YourModelDeleteView, YourModelDetail

urlpatterns = [
  path('<int:pk>/delete/', YourModelDeleteView.as_view(), name='your_app_name:delete_view_name'),
  path('<int:pk>/', YourModelDetail.as_view(), name='your_app_name:detail_view_name'),
]

在上述代码片段中,我们定义了两个URL模式,分别对应于我们的DetailView和DeleteView。

第四步: 设置DeleteView的 get_template_name() 方法

如果我们没有使用TemplateView来显示删除确认页面,则需要设置DeleteView的get_template_name()方法。下面是一个示例:

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')

    def get_template_name(self):
        return 'your_app_name/your_model_confirm_delete.html'

在上述代码片段中,我们为DeleteView类定义了get_template_name方法,并返回了正确的模板名称。

以上是使用DeleteView的基本步骤,下面是一些额外的选项和示例。

额外的选项

1. form_class

我们可以使用form_class属性指定需要使用的表单类别,下面是一个例子。

from .forms import YourForm

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')
    form_class = YourForm

在上述代码片段中,我们使用了自定义的表单类别YourForm。

2. template_name_suffix

默认情况下,DeleteView将删除模型的名称追加到模板的后缀上。例如,在上面的例子中,模板的名称将是your_app_name/your_model_confirm_delete.html。但是,如果需要,我们可以通过template_name_suffix属性手动指定模板的后缀。例如:

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')
    template_name_suffix = 'delete_confirm'

在上述代码片段中,我们手动指定了模板的名称后缀。

3. success_message

我们可以使用success_message属性指定成功消息。以下是一个例子:

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')
    success_message = "Your model was deleted successfully."

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(YourModelDeleteView, self).delete(request, *args, **kwargs)

在上述代码片段中,我们通过添加delete方法来定制DeleteView。在方法中,使用messages.success()添加成功消息。

示例

以下是一个使用DeleteView实现删除功能的示例。

from django.views.generic.edit import DeleteView
from django.contrib import messages
from django.urls import reverse_lazy
from django.shortcuts import render
from .models import YourModel

class YourModelDeleteView(DeleteView):
    model = YourModel
    success_url = reverse_lazy('your_app_name:success_url_name')
    success_message = "Your model was deleted successfully."

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(YourModelDeleteView, self).delete(request, *args, **kwargs)

class DeleteSuccessView(YourModelDeleteView):
    template_name = 'your_app_name/delete_success.html'

def your_view(request):
  # 获取列表
  context = {'object_list': YourModel.objects.all()}
  # 渲染出HTML
  return render(request, 'your_app_name/your_template.html', context)

以上示例在DeleteView类中定义了delete方法,该方法添加了一个成功消息。在DeleteSuccessView类中我们可以扩展DeleteView类,并为其添加了一个自定义的成功页面。

在我们的template.html模板中,我们将对象列表传递给模板,这可以使用ListView等其他视图类型来完成。

总结

DeleteView视图是Django中一个方便的工具,它提供了一种轻松的方式来构建模型的删除功能。它的使用方法非常简单,并且可以通过添加自定义方法和选项来满足更高级的需求。