【问题标题】:How to do a class based delete view that allows DELETE method in django 3.1?如何在 django 3.1 中执行允许 DELETE 方法的基于类的删除视图?
【发布时间】:2021-05-10 17:14:55
【问题描述】:

在 Django 3.1 中,典型的 DeleteView 接受 GET 和 POST。

见https://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/#deleteview

我在下面复制:

显示确认页面并删除现有对象的视图。仅当请求方法为 POST 时,才会删除给定的对象。如果此视图是通过 GET 获取的,它将显示一个确认页面,该页面应包含一个 POST 到同一 URL 的表单。

如何创建一个基于类的视图并接受 DELETE 方法的 DELETEView?

【问题讨论】:

标签: django django-class-based-views http-delete


【解决方案1】:

Tldr;我选择在服务器端使用 303,以便它可以正确重定向到列表视图

长话短说在这里https://stackoverflow.com/a/24375475/80353

在这个适用于 Spring(Java 框架)的 SO 答案中,这个问题和我有同样的问题。

  1. 发送删除
  2. 然后服务器端想使用 302 重定向
  3. 302 将使用先例方法,并且列表通常不接受 DELETE 作为先例方法。只有 POST、GET 和 HEAD 作为先例方法

这似乎是一个网络框架问题。但事实并非如此。这似乎是最明智的 Web 框架采用的惯例。

有3个缺点的解决方案:

1。重写约定

允许后端 Web 框架接受 DELETE 作为 302 的先例方法。

缺点:按惯例不好

2。让客户端处理重定向

发回 200 然后客户端将重定向回列表视图

Con:这会导致两个请求,而 htmx-delete 不能以这种方式工作。它将发送一个 DELETE 方法请求,然后取回任何返回并立即交换。我喜欢这个,所以我想保留这个。一个请求解决这个问题,而不是两个。

3。使用 303 进行重定向

删除成功后,做一个303重定向到列表视图(我选择了这个)

Con:303 不适用于 HTTP/1.0 和旧版浏览器。但这在 2021 年不成问题,今后也不会成为问题。

最后我写了自己的deleteview

from django.views.generic.detail import BaseDetailView

class DeleteThingView(BaseDetailView):
    http_method_names = ["delete"]
    model = Thing

    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        self.object.delete()
        response = redirect(reverse_lazy("things-list"))
        response.status_code = 303
        return response

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2015-08-25
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多