Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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 有没有办法对Django应用程序中的每个模型应用元权限?_Python_Django_Django Models - Fatal编程技术网

Python 有没有办法对Django应用程序中的每个模型应用元权限?

Python 有没有办法对Django应用程序中的每个模型应用元权限?,python,django,django-models,Python,Django,Django Models,我想为Django应用程序中的每个模型添加一个can_view元权限 我很想把它添加到models.py中的每个类中 我甚至不确定self.verbose\u名称在本例中是否会像这样工作 这可能吗 附加问题:一旦我在模型的元中添加了权限,那么我就可以调用它了,对吗?像 if request.user.has_perm( 'polls.can_view' ) : # Show a list of polls. else : # Say "Insufficient permissio

我想为Django应用程序中的每个模型添加一个can_view元权限

我很想把它添加到models.py中的每个类中

我甚至不确定self.verbose\u名称在本例中是否会像这样工作

这可能吗

附加问题:一旦我在模型的元中添加了权限,那么我就可以调用它了,对吗?像

if request.user.has_perm( 'polls.can_view' ) :
    # Show a list of polls.
else :
    # Say "Insufficient permissions" or something.    

最简单和最明显的方法是自定义基础模型,它是所有模型的父模型。这样,您或其他程序员将永远不知道该死的can_视图是从哪里来的

class CustomBaseModel(models.Model):
    class Meta:
        abstract = True
        permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

class SomeModel(CustomBaseModel):
    # ...

但是,这需要您更改所有模型,只需少量搜索和替换即可轻松完成,而且不会更改Djangos内置模型,如User。

最简单和最明显的方法是自定义基础模型,它是所有模型的父模型。这样,您或其他程序员将永远不知道该死的can_视图是从哪里来的

class CustomBaseModel(models.Model):
    class Meta:
        abstract = True
        permissions = [ ( "can_view", "Can view {something}".format( something = self.verbose_name ) ]

class SomeModel(CustomBaseModel):
    # ...

但是,这需要您更改所有模型,只需进行少量搜索和替换即可轻松完成,并且不会更改Djangos内置模型(如User)。

权限也是一个普通的Django模型实例。您可以像创建任何其他模型一样创建它

所以你需要像

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

for content_type in ContentType.objects.all():
     Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name)

您需要做一次,所以signal看起来是一个很好的地方。

权限也是一个普通的Django模型实例。您可以像创建任何其他模型一样创建它

所以你需要像

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

for content_type in ContentType.objects.all():
     Permission.objects.create(content_type=content_type, codename='view_%s' % content_type.model, name='Can view %s' % content_type.name)

您需要这样做一次,所以signal看起来是一个很好的地方。

我自己也在想,但最终我只有少数几个模型具有detailview,所以我没有费心在所有模型上启用view权限。但我知道,在一个有很多detailview的项目中,一个接一个地执行这些操作可能会很乏味。另一方面,我确实创建了一个基本视图类来继承它,以检查权限:因此这可能会有所帮助。如果你不使用django guardian,那么你仍然可以很容易地适应它。另外:别忘了用我在python中添加的语言标记你的问题tag@jpic是的,我想知道为什么Django没有使用can_view作为默认权限之一。我只有5个模型需要这些权限。也许我可以覆盖Django的模型。模型类?这可能不值得。顺便说一下,谢谢你在过去的两个月里帮助我解决Django的问题。你就像我在这里的私人导师,所以:-。你是否经常检查我的问题或什么lol?我想知道自己,但最终我只有少数几个模型有详细视图,所以我没有费心尝试在所有模型上启用查看权限。但我知道,在一个有很多detailview的项目中,一个接一个地执行这些操作可能会很乏味。另一方面,我确实创建了一个基本视图类来继承它,以检查权限:因此这可能会有所帮助。如果你不使用django guardian,那么你仍然可以很容易地适应它。另外:别忘了用我在python中添加的语言标记你的问题tag@jpic是的,我想知道为什么Django没有使用can_view作为默认权限之一。我只有5个模型需要这些权限。也许我可以覆盖Django的模型。模型类?这可能不值得。顺便说一下,谢谢你在过去的两个月里帮助我解决Django的问题。你就像我在这里的私人导师,所以:-。你是否经常检查我的问题或lol?这会导致名称错误:名称“self”未定义我如何向用户添加can\u视图?我想这更像是一个Python问题。我知道如何继承和扩展类,但这会给它一个不同的名称。如何在不修改源代码的情况下替换和扩展这些内置的Django类并保持相同的名称?有点像用你的模板覆盖Django管理员页面,或者我应该将can_视图应用到UserProfile?不管怎样,我的问题更多的是从Python的角度,而不是Django的角度,所以我仍然想知道我假设的问题的解决方案。这将导致NameError:名称“self”未定义我如何向用户添加can_视图?我想这更像是一个Python问题。我知道如何继承和扩展类,但这会给它一个不同的名称。如何在不修改源代码的情况下替换和扩展这些内置的Django类并保持相同的名称?有点像用你的模板覆盖Django管理员页面,或者我应该将can_视图应用到UserProfile?不管怎样,我的问题更多的是从Python的角度提出的,而不是Django,所以我仍然想知道我假设的问题的解决方案。我应该把这段代码放在哪里?我应该把post_syncdb信号代码放在哪里?供其他人将来参考:你可以把信号处理和注册代码放在任何你喜欢的地方。但是,您需要确保它所在的模块尽早导入,以便si
gnal处理在需要发送任何信号之前被注册。这使你的应用程序的models.py成为注册信号处理程序的好地方。@hobbes3我更喜欢将它放在名为signals.py的文件中,并在models.py的末尾导入它。顺便说一句,如果有人感兴趣,setttings.py中安装的每个应用程序都会调用post_syncdb。因此需要放置一行,如Permission.objects.filter content\u type\u id=content\u type.pk,codename\uuuu contains='view\uuu'为无:检查以确保每种内容类型的权限应用不超过一次。@hobbes3 sender arg。我应该将此代码放在哪里,以及将post\u syncdb信号代码放在哪里?供其他人参考:您可以将信号处理和注册代码放在任何您喜欢的地方。但是,您需要确保尽早导入它所在的模块,以便在需要发送任何信号之前注册信号处理。这使你的应用程序的models.py成为注册信号处理程序的好地方。@hobbes3我更喜欢将它放在名为signals.py的文件中,并在models.py的末尾导入它。顺便说一句,如果有人感兴趣,setttings.py中安装的每个应用程序都会调用post_syncdb。因此,您需要放置一行,如Permission.objects.filter content\u type\u id=content\u type.pk,codename\u contains='view\u'为None:检查以确保每个内容类型的权限应用不会超过一次。@hobbes3 sender arg。