Python DjangoAdmin具有从另一个管理类执行的\u delete\u权限
我有两个管理模型,一个叫动物,另一个叫人。每一个都有自己的Python DjangoAdmin具有从另一个管理类执行的\u delete\u权限,python,django,django-admin,Python,Django,Django Admin,我有两个管理模型,一个叫动物,另一个叫人。每一个都有自己的在ModelAdmin类上拥有\u delete\u权限。 下面列出了我正在使用的代码。 类动物(models.Model): sound=models.CharField(最大长度=25,空白=True,空=True) 班级负责人(models.Model): sound=models.CharField(最大长度=25,空白=True,空=True) 类AnimalAdmin(admin.ModelAdmin): 模型=动物 def
在ModelAdmin
类上拥有\u delete\u权限。
下面列出了我正在使用的代码。
类动物(models.Model):
sound=models.CharField(最大长度=25,空白=True,空=True)
班级负责人(models.Model):
sound=models.CharField(最大长度=25,空白=True,空=True)
类AnimalAdmin(admin.ModelAdmin):
模型=动物
def具有删除权限(self、request、obj=None):
如果request.POST和request.POST.get('action')=='delete_selected':
animals=Animal.objects.filter(id\uu in=request.POST.getlist(“\u selected\u action”))
印刷品(动物)
返回真值
类PersonAdmin(admin.ModelAdmin):
模特=人
def具有删除权限(self、request、obj=None):
返回真值
管理站点注册(动物、动物管理员)
管理员站点注册(个人,个人管理员)
当我尝试删除与某些动物具有相同ID的Person实例时,将打印动物的实例。如果我在做一些逻辑操作,如更改数据库或向用户显示消息,这可能是一个严重的问题
关键是为什么具有删除权限
也会执行不同类的方法?这是因为类的一个方法AdminSite
:
在管理后端呈现的每个页面中都会调用此方法,它会依次调用get\u app\u list(request)
,然后调用\u build\u app\u dict(request)
,这将在所有管理模型上循环以检查:
因此,如果您在othersModelAdmin
中覆盖具有_delete_权限
,则每次显示页面时也会调用它
您将看到动物
的实例与已删除的人
的相同索引相匹配,因为您使用来自请求
(request.POST.getlist(“'u selected_action')的简单索引列表过滤查询集。
)
注意:当您不在POST请求中时,不会打印任何内容
也就是说,您应该避免在一个函数中混用不同的内容:has_delete_permission
是关于检查模型的删除权限。我不确定你想在这里检查/预防什么,但你可以找到一个更好的地方 我在做类似的事情。但从表面上看,这并不合适。
def each_context(self, request):
"""
Return a dictionary of variables to put in the template context for
*every* page in the admin site.
For sites running on a subpath, use the SCRIPT_NAME value if site_url
hasn't been customized.
"""
def get_model_perms(self, request):
"""
Return a dict of all perms for this model. This dict has the keys
``add``, ``change``, ``delete``, and ``view`` mapping to the True/False
for each of those actions.
"""
return {
'add': self.has_add_permission(request),
'change': self.has_change_permission(request),
'delete': self.has_delete_permission(request),
'view': self.has_view_permission(request),
}