5

在使用食谱的 Django 应用程序中,我已将其子类化DeleteView以创建我的IngredientListItemDeleteView,但我希望结果get_success_url取决于刚刚删除的项目的属性。

我想做这样的事情:

def get_success_url(self):
    item = get_object_or_404(IngredientListItem, pk=self.kwargs['pk'])   # -> 404
    return this_item.recipe.get_absolute_url()

我知道我收到 404 错误,因为相关项目不再存在,但我没有运气在删除之前存储有关该项目的相关信息(即其包含的配方)。例如,如果我在get方法中放入任何代码,例如

self.success_url = get_object_or_404(IngredientListItem, 
                                pk=self.kwargs['pk']).recipe.get_absolute_url()

然后在success_url查看时(删除后),它的值为无。

如何使我的成功 URL 取决于已删除项目的此属性?

4

1 回答 1

7

在 Django 1.6 中,该delete方法已更改,以便在删除对象之前get_success_url调用该方法。

def delete(self, request, *args, **kwargs):
    """
    Calls the delete() method on the fetched object and then
    redirects to the success URL.
    """
    self.object = self.get_object()
    success_url = self.get_success_url()
    self.object.delete()
    return HttpResponseRedirect(success_url)

我建议您在升级到 Django 1.6 之前覆盖上面的删除方法。如果您需要为多个类执行此操作,您可以创建一个 mixin。

请注意,您不需要从数据库中获取项目get_item_or_404- 您可以在您的get_success_url方法中以self.object.

于 2013-07-29T10:45:25.493 回答