我有两个与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)
但是,它不起作用...... 如何覆盖红色按钮删除方法?
谢谢
答案 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)