在Django Admin中,内联是一种方便的方式,可以在编辑父模型时直接编辑关联的子模型。然而,默认情况下,Django Admin内联允许删除子模型实例。如果想要防止这种删除操作,可以使用readonly_fields
属性和自定义方法来实现。
首先,我们需要在内联模型(admin.TabularInline或admin.StackedInline)中设置readonly_fields
属性。这将使相关字段在编辑界面上成为只读状态,不能进行编辑和删除。
例如,假设我们有两个模型,一个是ParentModel
,一个是ChildModel
,并且在ParentModel
的Django Admin中使用了内联来管理ChildModel
。
from django.contrib import admin
from .models import ParentModel, ChildModel
class ChildInline(admin.StackedInline):
model = ChildModel
readonly_fields = ['field1', 'field2'] # 设置只读字段
class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline]
admin.site.register(ParentModel, ParentAdmin)
在上面的示例中,我们将ChildInline
内联到ParentAdmin
中,并设置了readonly_fields
属性来指定需要设置为只读的字段。这样,当我们在Django Admin中编辑ParentModel
时,ChildModel
的相关字段将不可编辑。
但是,这种方式仍然无法防止删除子模型实例的操作。为了实现防止删除的功能,我们可以在内联模型(admin.TabularInline或admin.StackedInline)中覆盖has_delete_permission
方法,该方法控制是否有权限删除子模型实例。
from django.contrib import admin
from .models import ParentModel, ChildModel
class ChildInline(admin.StackedInline):
model = ChildModel
readonly_fields = ['field1', 'field2'] # 设置只读字段
def has_delete_permission(self, request, obj=None):
return False # 禁止删除子模型实例
class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline]
admin.site.register(ParentModel, ParentAdmin)
在上面的示例中,我们在ChildInline
内联模型中覆盖了has_delete_permission
方法,并返回False
来禁止删除子模型实例。这样,即使用户尝试删除子模型实例,也会被拒绝执行删除操作。
综上所述,通过设置readonly_fields
属性和覆盖has_delete_permission
方法,可以正确防止Django Admin内联删除实例的操作。
参考链接:
领取专属 10元无门槛券
手把手带您无忧上云