Django admin - 在编辑屏幕中覆盖红色按钮删除方法

时间:2017-05-02 20:38:31

标签: django-admin

我有两个与FK相关的模型:

class ModelA(models.model):
    name = models.CharField(unique=True, max_length=250)  
class ModelB(models.model):
    name = models.CharField(unique=True, max_length=250)
    model_a = models.ForeignKey(ModelA,
                                on_delete=models.PROTECT)

因此,要删除ModelA的实例,我必须删除与它相关的ModelB实例。 我重写了delete_selected()方法,当我使用管理员的批量删除功能时,它可以正常工作。
但是当我编辑ModelA实例时,在管理界面中,点击"编辑屏幕中的红色删除按钮"它没有用。

Deleting the ModelA 'first-model-A' would require deleting the following protected related objects:

所以我也覆盖了delete_model()方法:

def delete_model(self, request, obj):
        # here delete ModelB instances related to ModelA instance                
        super(ModelAAdmin, self).delete_model(request, obj)        

但是,它不起作用...... 如何覆盖红色按钮删除方法?

谢谢

1 个答案:

答案 0 :(得分:0)

on_delete=models.PROTECT的要点是它可以防止删除模型A及其关系,直到它的关系为无。 Django ORM将引发ProtectedError。您无法删除具有Model B关系的Model A实例。

所以问题应该是你为什么使用受保护的机制?

但如果你真的需要这种方式......我会删除所有引用模型A实例的模型B对象与模型模型A的关系。

稍后编辑:

覆盖' delete_confirmation.html'模板来自&django / contrib / admin / templates / admin / delete_confirmation.html'。我只是删除" {%elif protected%}"部分,但你可以随心所欲地看。

在管理文件中有类似的内容:

class ModelAAdmin(admin.ModelAdmin):
    def delete_view(self, request, object_id, extra_context=None):
        self.delete_confirmation_template = "dummy/admin/dummy/modela/delete_confirmation.html"
        return super(ModelAAdmin, self).delete_view(request, object_id, extra_context)

    def delete_model(self, request, obj):
        for modelb_obj in obj.modelb_set.all():
            modelb_obj.delete()
        return super(ModelAAdmin, self).delete_model(request, obj)

admin.site.register(ModelA, ModelAAdmin)

第二次编辑:

也许你可以尝试类似的东西:

def delete_view(self, request, object_id, extra_context=None):
    self.delete_confirmation_template = "dummy/admin/dummy/modela/delete_confirmation.html"
    if request.method == 'POST':
        ModelB.objects.filter(model_a__id=object_id).delete()
    return super(ModelAAdmin, self).delete_view(request, object_id, extra_context)