删除相关数据后,在DeleteView上使用get_success_url

bry*_*ryn 5 django django-class-based-views

在使用配方的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()
Run Code Online (Sandbox Code Playgroud)

我知道我收到404错误,因为有问题的项目不再存在,但我没有运气存储关于该项目的相关信息(即其包含的食谱),然后才被删除.例如,如果我将get任何代码放入方法中

self.success_url = get_object_or_404(IngredientListItem, 
                                pk=self.kwargs['pk']).recipe.get_absolute_url()
Run Code Online (Sandbox Code Playgroud)

然后到时候success_url看(删除后),它的值为None.

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

Ala*_*air 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)
Run Code Online (Sandbox Code Playgroud)

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

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