如何在django中为用户模型添加自定义权限?

时间:2011-10-11 09:57:53

标签: python django django-permissions

默认情况下,在安装了django.contrib.auth的syncdb运行时,在django中

,它会为每个模型创建默认权限...如foo.can_change,foo.can_delete和foo.can_add。要向模型添加自定义权限,可以在模型下添加类Meta:并在那里定义权限,如此处所述https://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions

我的问题是,如果我想为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类。我应该在MetaTlass类中使用这些,因为这是扩展用户模型的方法。但这是正确的方法吗?这不会与UserProfile模型联系起来吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

我认为这里没有“正确”的答案,但我使用了与您完全相同的代码,只是我将Permission.objects.create更改为Permission.objects.get_or_create并且找到了与syncdb同步

答案 2 :(得分: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 :(得分:0)

这有点棘手,但无论如何还是在此提及以供参考。

我的网站有一个名为Setting的通用模型,该模型存储有关我希望某些用户能够编辑的网站的各种设置,而无需经过开发人员(例如注册限制或地址,或商品成本等)。

所有无法很好地映射到其他模型的权限(例如,“向学生发送密码提醒电子邮件”,“生成付款对帐报告”,“生成PDF收据”),这些权限实际上仅与在管理区域,转储到此Setting模型上。

例如,这是模型:

class Setting(models.Model):
    name = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(editable=False)
    description = models.TextField()
    value = models.TextField()
    class Meta:
        #for permissions that don't really relate to a particular model, and I don't want to programmatically create them.
        permissions = (
            ("password_reminder", "Send Password Reminder"),
            ("generate_payment_reconciliation_report", "Generate Payment Reconciliation Report"),
            ("generate_pdf_receipt", "Generate PDF Receipt"),
        )

这些设置中的每一个是否都与{{​​1}}模型相关?不,这就是为什么我说这有点古怪。但是很高兴我现在可以将所有这些权限转储到这里,而Django的迁移命令将负责其余的工作。