用于 DELETE 方法的基于 Django 类的视图无法重定向到 ListView

问题描述

我使用的是 django 3.1 和基于类的视图。

当我发送一个带有 DELETE 的 METHOD_OVERRIDE 请求并使用 POST 时,它被正确地发送到我设置的删除视图。

@method_decorator(login_required,name="dispatch")
class ServerDetail(DeleteView):
    # form_class = ServerCreateForm
    model = Server
    # template_name = "core/server/create.html"
    success_url = reverse_lazy("servers-list")

    def get_success_url(self):
        if self.success_url:
            return self.success_url
        else:
            raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")

    def delete(self,request,*args,**kwargs):
        user = self.request.user
        social_token = SocialToken.objects.filter(
            account__user=user,account__provider="digitalocean"
        ).first()
        
        droplet_id = kwargs["pk"]
        droplet = digitalocean.Droplet(id=droplet_id,token=social_token.token)

        droplet.destroy()

        success_url = self.get_success_url()

        return redirect(success_url)

    def post(self,**kwargs):
        return self.delete(request,**kwargs)

但是它会在重定向到 /servers/ 时失败,会出现 405 Method Not Allowed 错误

请求是作为 X-HTTP-Method-Override 在发送到 /servers/:id/ 的 POST 请求中设置为 DELETE 发送的。

删除成功,问题出在删除成功后的重定向

它在控制台中的样子

[10/Jan/2021 14:58:30] "GET /servers/ HTTP/1.1" 200 4105
[10/Jan/2021 14:58:36] "DELETE /servers/12345 HTTP/1.1" 301 0
[10/Jan/2021 14:59:15] "DELETE /servers/12345/ HTTP/1.1" 302 0
Method Not Allowed (DELETE): /servers/
Method Not Allowed: /servers/
[10/Jan/2021 14:59:15] "DELETE /servers/ HTTP/1.1" 405 0

什么是解决方法

但是,如果我向 /servers/:id/delete 发送了一个常规的 POST 方法并相应地设置了 url,重定向就可以了。

所以基本上我在使用基于类的视图时不能使用 DELETE 是吗?

更新

显然这是因为客户端对 302 重复使用相同的 DELETE 方法。因此现在将 htmx 作为标记添加到问题中

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)