Для DeleteView
нет form_valid
, поскольку DeleteView
не имеет формы.
Что мы можем сделать, это добавить некоторую логику в функцию .delete(..)
, которая является функцией, удаляющей объект. DeleteView
реализует это как:
def delete(self, request, *args, **kwargs):
"""
Call the delete() method on the fetched object and then redirect to the
success URL.
"""
self.object = self.get_object()
success_url = self.get_success_url()
self.object.delete()
return HttpResponseRedirect(success_url)
Таким образом, мы можем реализовать это как:
from django.db.models import F
class DeletePostView(LoginRequiredMixin, DeleteView):
model = Post
# ...
def <b>delete</b>(self, *args, **kwargs):
self.object = self.get_object()
<b>self.object.post.categories.all().update(posts=F('posts')-1)</b>
return super(DeletePostView, self).delete(*args, **kwargs)
Выше будет обновлять категории в "навалом", уменьшая поле posts
. Здесь может достичь нуля (что невозможно в данном коде).
Если вы хотите предотвратить это, мы можем использовать Greatest
[Django-doc] , чтобы избежать этого:
from django.db.models import F, Value
from django.db.models.functions import Greatest
class DeletePostView(LoginRequiredMixin, DeleteView):
model = Post
# ...
def <b>delete</b>(self, *args, **kwargs):
<b>self.object.post.categories.all().update(posts=Greatest(F('posts')-1, Value(1)))</b>
return super(DeletePostView, self).delete(*args, **kwargs)