Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DjangoAdmin具有从另一个管理类执行的\u delete\u权限_Python_Django_Django Admin - Fatal编程技术网

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)
,这将在所有管理模型上循环以检查:


因此,如果您在others
ModelAdmin
中覆盖
具有_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),
    }