5

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)
4

1 に答える 1

5

pk削除する前にオブジェクトを保存します。__init__たとえば、で。そして、URLパターンに名前を付けます

于 2012-05-17T07:36:34.230 に答える