2011-10-11 73 views
16

在django默认情况下,当syncdb在安装django.contrib.auth的情况下运行时,它会在每个模型上创建默认权限......比如foo.can_change,foo.can_delete和foo.can_add。要向模型添加自定义权限,可以添加类Meta:在该模型下定义权限,如此处所述https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions如何在django中为用户模型添加自定义权限?

我的问题是,如果我想向User模型添加自定义权限,应该怎么做?像foo.can_view。我可以用下面的代码片段做到这一点,

ct = ContentType.objects.get(app_label='auth', model='user') 
perm = Permission.objects.create(codename='can_view', name='Can View Users', 
            content_type=ct) 
perm.save() 

但我想要的东西,与执行syncdb在我的定制机型很好地发挥,例如类元。我应该只在Meta类中有这些:在UserProfile下,因为这是扩展用户模型的方式。但这是正确的方法吗?这不会将它与UserProfile模型绑定吗?

+0

你可以做,在模型的迁移:http://stackoverflow.com/a/32706020/538284 –

回答

3

我不认为这是一个“正确”的答案在这里,但我使用完全相同的代码,你除了我改变Permission.objects.createPermission.objects.get_or_create和努力找到执行syncdb

+0

不会get_or_create,创建另一个权限如果名称的变化,但代号保持不变? –

+1

你应该只使用代码名作为获取或创建的一部分,并将其名称设置为“defaults” – leech

8

你可以做类似的同步这样的:

在你的Django应用程序添加的__init__.py

from django.db.models.signals import post_syncdb 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 

# custom user related permissions 
def add_user_permissions(sender, **kwargs): 
    ct = ContentType.objects.get(app_label='auth', model='user') 
    perm, created = Permission.objects.get_or_create(codename='can_view', name='Can View Users', content_type=ct) 
post_syncdb.connect(add_user_permissions, sender=auth_models) 
+0

放入一个'__init __。py'并连接到'post_syncdb'可能是一个好主意,但上面的代码didn不为我工作。我必须使用'ContentType.objects.get_for_model(model = auth_models.User)'。否则,它的工作。 – brianmearns

2

Django的1.8更新的答案。使用信号pre_migrate代替pre_syncdb,因为syncdb已被弃用,并且文档建议使用pre_migrate而不是post_migrate,如果信号会改变数据库的话。此外,@receiver用于将add_user_permissions连接到信号。

from django.db.models.signals import pre_migrate 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.auth import models as auth_models 
from django.contrib.auth.models import Permission 
from django.conf import settings 
from django.dispatch import receiver 


# custom user related permissions 
@receiver(pre_migrate, sender=auth_models) 
def add_user_permissions(sender, **kwargs): 
    content_type = ContentType.objects.get_for_model(settings.AUTH_USER_MODEL) 
    Permission.objects.get_or_create(codename='view_user', name='View user', content_type=content_type) 
+3

我可以问我在哪个文件中必须放置此代码?我虽然是在Django的早期版本中设置模型,但我不知道... – softwareplay

+0

@mcastle我把它放在'__init __。py'中,但是“DoesNotExist:ContentType匹配查询不存在”。错误仍在 –

相关问题