Представления на основе классов Django для метода УДАЛЕНИЯ не могут перенаправляться в ListView

#django #django-class-based-views #http-delete #htmx

#django #представления на основе классов django #http-delete #htmx

Вопрос:

Я использую представления на основе django 3.1 и классов.

Когда я отправляю запрос METHOD_OVERRIDE с помощью DELETE и использую 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, request, *args, **kwargs):
        return self.delete(request, *args, **kwargs)
 

Но это не удастся, так как при перенаправлении на /servers/ будет ошибка 405 «Метод не разрешен».

Запрос был отправлен как X-HTTP-Method-Override, для которого установлено значение DELETE в POST-запросе /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. Следовательно, теперь добавляем htmx в качестве тега к вопросу

Комментарии:

1. Как вы сделали запрос на удаление?

2. X-HTTP-Method-Override установлено значение DELETE в запросе POST на /servers/:id/

3. Кстати, мне нравится ваш веб-сайт antipatterns 👍

4. какой метод поступает в «консоль». Можете ли вы увидеть запрос на УДАЛЕНИЕ (обычно представление на основе классов может обрабатывать запрос на удаление), поэтому я пытаюсь выяснить, в чем проблема.

5. можете ли вы обновить вопрос? Я вставил то, что видел в консоли. Не уверен, что это то, на что вы ссылаетесь. существует некоторая задержка в запросе, потому что я запускал ipdb, чтобы проверить, действительно ли был вызван метод удаления