从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')
答案 0 :(得分:1)
如果您希望保留使用其余delete_view
的功能,建议您同时覆盖delete_view
和response_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>