BookとPageの2つのモデルがあるとしましょう。
class Book(models.Model):
pass
class Page(models.Model):
book = models.ForeignKey(Book)
ページを削除して、そのページが属していた特定の本にリダイレクトする必要があります。これを実現するために、クラスベースのビューを作成してページを削除します。
class PageDeleteView(DeleteView):
model = Page
def get_success_url(self, **kwargs):
return reverse_lazy('book_detail', self.book.pk)
問題は、get_success_urlが呼び出される前にオブジェクトが削除されるため、このメソッドが失敗し、404エラーが発生することです。
どうすればいいですか?
アップデート:
@DrTyrsaのアイデアに従って、deleteメソッドをオーバーライドすることを実現したので、クラスは次のようになります。
reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args)
class PageDeleteView(DeleteView):
model = Page
def get_success_url(self, **kwargs):
return reverse_lazy('book_detail', self.book.pk)
def delete(self, request, *args, **kwargs):
self.book_pk = self.get_object().book.pk
return super(PageDeleteView, self).delete(request, *args, **kwargs)