我正在使用 django 3.1 和基于类的视图。
当我使用 DELETE 并使用 POST 发送 METHOD_OVERRIDE 请求时,它会正确发送到我设置的删除视图。
@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, request, *args, **kwargs):
return self.delete(request, *args, **kwargs)
但它会失败,因为在重定向到 /servers/ 时会出现 405 Method Not Allowed 错误。
该请求作为 X-HTTP-Method-Override 在 POST 请求中设置为 DELETE 发送到/servers/:id/
.
删除成功,问题在于成功删除后的重定向。
它在控制台中的样子
[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
什么是解决方法
但是,如果我发送一个常规的 POST 方法/servers/:id/delete
并相应地设置 url,那么重定向就可以了。
所以基本上当我使用基于类的视图时我不能使用 DELETE 是吗?
更新
显然这是因为客户端为 302 重用了相同的 DELETE 方法。因此现在将 htmx 作为标签添加到问题中