【问题标题】:Django admin redirect to parent after object delete对象删除后 Django 管理员重定向到父级
【发布时间】:2025-12-30 05:45:11
【问题描述】:

从 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 解决方案是在子对象的 Unicode 表示中传递父 ID (obj_display),然后解析字符串以找到它:

obj_display = '1 (Product 123)'

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

product_id = 123

但是,这似乎是一个不雅的解决方案。例如,如果对象的 unicode 方法更改,重定向可能会中断。有没有更好的办法?

编辑

“父”和“子”是指已删除的(“子”)对象具有另一个对象(其“父”)的外键

【问题讨论】:

  • “被删除对象的父级”是什么意思?
  • 我的意思是被删除的对象有一个指向另一个对象的外键,它是它的'父'。

标签: django django-admin


【解决方案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')

【讨论】:

    【解决方案2】:

    你可以覆盖这个方法delete_view(在那里你可以得到对象的父对象,然后删除它)而不是这样做return self.response_delete(request, obj_display, obj_id),只需重定向到父管理页面。

    【讨论】: