在 BaseUpdateView 中使用的 ModelFormMixin 中,方法get_success_url()
具有url = self.object.get_absolute_url()
因此,我们不需要在视图中编写success_url = reverse_lazy('blablabla')
,而只需在模型中确定get_absolute_url()
方法。
但 BaseDeleteView 使用的 DeletionMixin 并不是这样做的,它需要success_url
。
为什么呢?为什么不使这些方法相同?我不得不为我的 DeleteView 覆盖get_success_url
,因此现在正在使用get_absolute_url()
。
或者我在视图中无法与success_url
一起正常工作?基本上,我需要的是反转 ForeignKey 可访问的模型的URL,我现在这样做:
model Child (models.Model):
parent = models.ForeignKey (Parent)
def get_absolute_url (self):
return reverse ('parent-detail', kwargs = {'pk': str (self.parent.pk)})
如何在success_url
中完成相同的操作?我无法在视图中编写self.parent.pk
答案 0 :(得分:5)
如何才能对删除视图起作用? Django如何重定向到不再存在的对象的详细信息页面?这毫无意义;该页面应返回404。
我也不明白为什么你认为你不能在视图中引用父PK。你当然可以:
def get_success_url(self):
return reverse ('parent-detail', kwargs={'pk': self.object.parent.pk})
答案 1 :(得分:3)
我认为你在这里混淆了一些事情。 get_absolute_url()
应该指向它被调用的对象的视图(在你的情况下是一个Child实例)。来自文档:
定义一个get_absolute_url()方法来告诉Django如何计算 对象的规范URL。
FormView的行为是在您成功编辑对象后指向此URL。这是有道理的,因为您通常希望向用户显示用户编辑操作的结果。
然而,DeleteView无法执行此操作,因为在成功删除(子)对象后,它当然无法再显示。
因此,简而言之,请勿使用get_absolute_url指向其他任何位置作为对象的规范视图(我猜是child-detail
)。
如果你真的想在你的情况下重复使用代码,你最好写一个小的mixin类,例如:
class OnSuccessShowParent(object):
def get_success_url(self):
child = self.get_object()
return reverse ('parent-detail', kwargs = {'pk': str (child.parent.pk)})
然后将其混合到您的通用视图中:
class EditChild(FormView, OnSuccessShowParent):
...
class DeleteChild(DeleteView, OnSuccessShowParent):
...
注意:因为在调用get_success_url()之后删除了对象,所以这很好。