Python Django:DeleteView从ForeignKey传递参数';s模型以获取\u成功\u url
在用户删除了一个PieceInstance之后,我想将他重定向到PieceInstance所属的片段。我使用默认的DeleteView,并希望将工件id(工件通过ForeignKey引用的PieceInstance)传递给get_success_url方法Python Django:DeleteView从ForeignKey传递参数';s模型以获取\u成功\u url,python,django,Python,Django,在用户删除了一个PieceInstance之后,我想将他重定向到PieceInstance所属的片段。我使用默认的DeleteView,并希望将工件id(工件通过ForeignKey引用的PieceInstance)传递给get_success_url方法self.piece.pk似乎无法获取对应工件的id 型号.py class PieceInstance(models.Model): id = models.UUIDField(primary_key=True, default=uu
self.piece.pk
似乎无法获取对应工件的id
型号.py
class PieceInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular Piece across whole system')
piece = models.ForeignKey('Piece', on_delete=models.SET_NULL, null=True)
...
class Piece(models.Model):
title = models.CharField(max_length=200)
...
class PieceInstanceDelete(LoginRequiredMixin, DeleteView):
model = PieceInstance
def get_success_url(self):
return reverse_lazy('piece-detail', kwargs={'pk': self.piece.pk})
path('piece/<int:pk>', views.PieceDetailView.as_view(), name='piece-detail')
视图.py
class PieceInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular Piece across whole system')
piece = models.ForeignKey('Piece', on_delete=models.SET_NULL, null=True)
...
class Piece(models.Model):
title = models.CharField(max_length=200)
...
class PieceInstanceDelete(LoginRequiredMixin, DeleteView):
model = PieceInstance
def get_success_url(self):
return reverse_lazy('piece-detail', kwargs={'pk': self.piece.pk})
path('piece/<int:pk>', views.PieceDetailView.as_view(), name='piece-detail')
url.py
class PieceInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular Piece across whole system')
piece = models.ForeignKey('Piece', on_delete=models.SET_NULL, null=True)
...
class Piece(models.Model):
title = models.CharField(max_length=200)
...
class PieceInstanceDelete(LoginRequiredMixin, DeleteView):
model = PieceInstance
def get_success_url(self):
return reverse_lazy('piece-detail', kwargs={'pk': self.piece.pk})
path('piece/<int:pk>', views.PieceDetailView.as_view(), name='piece-detail')
path('piece/',views.PieceDetailView.as_view(),name='piece-detail')
根据源代码,对象在被删除之前存储在self.object
中。因此,您可以使用以下命令重定向到相关片段的主键:
class PieceInstanceDelete(LoginRequiredMixin, DeleteView):
model = PieceInstance
def get_success_url(self):
return reverse_lazy('piece-detail', kwargs={'pk': self.object.piece_id})
使用以下答案获得:
这里是DeleteView类:
class PieceInstanceDelete(LoginRequiredMixin, DeleteView):
model = PieceInstance
def get_success_url(self):
piece = self.object.piece
return reverse_lazy('piece-detail', kwargs={'pk': piece.pk})
再次感谢威廉的澄清。你能告诉我你所说的未文档化是什么意思吗?@AaronScheib:我的意思是,CreateView
和UpdateView
拥有一个对象
属性(),而删除视图
,这意味着Django的开发者拥有“自由”以他们想要的方式实施。是的,现在这设置了一个self.object
(),但是他们可以很容易地改变主意。@WillemVanOnsem谢谢你的帖子,这非常有帮助。我按照您的说明修补了delete
函数,但一直出现以下错误:DeleteView未返回HttpResponse对象。相反,它没有返回任何值。
结果表明,通过执行delete
实际返回超级调用解决了问题。