删除对象后,Django admin重定向到父级

时间:2016-04-14 11:58:13

标签: django django-admin

从Django 1.7开始,可以覆盖Admin Model的response_delete方法,强制它在删除后重定向到自定义URL。

class MyAdmin(admin.ModelAdmin):

    def response_delete(self, request, obj_display, obj_id):
        return HttpResponseRedirect("my_url")

我需要更进一步,并重定向到已删除对象的,这似乎应该是一个相当常见的用例。

但是由于删除了该对象,因此没有obj可用于获取父ID。

我找到的hacky解决方案是在子对象(obj_display)的Unicode表示中传递父ID,然后解析字符串以找到它:

obj_display = '1 (Product 123)'

integers = re.findall(r'\d+', obj_display)
product_id = int(integers[1])

product_id = 123

然而,这似乎是一个不优雅的解决方案。例如,如果对象的unicode方法发生了更改,则重定向可能会中断。还有更好的方法吗?

修改

by'parent'和'child'我的意思是删除的('child')对象有另一个对象的外键('parent')

2 个答案:

答案 0 :(得分:1)

如果您希望保留使用其余delete_view的功能,建议您同时覆盖delete_viewresponse_delete

class MyModelAdmin(admin.ModelAdmin):
    deleted_fk = None

    def delete_view(self, request, object_id, extra_context=None):
        self.deleted_fk = MyModel.objects.get(id=object_id).fk
        return super(MyModelAdmin, self).delete_view(request, object_id, extra_context)

    def response_delete(self, request, obj_display, obj_id):
        return redirect('url to deleted_fk')

答案 1 :(得分:0)

您可以覆盖此方法delete_view(您可以在删除之前获取对象的父级),而不是执行此return self.response_delete(request, obj_display, obj_id),只需重定向到父级管理页面。 / p>