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

Python 如何在django中向用户模型添加自定义权限?,python,django,django-permissions,Python,Django,Django Permissions,默认情况下,在django中,在安装了django.contrib.auth的情况下运行syncdb时,会在每个模型上创建默认权限。。。像foo.can\u change、foo.can\u delete和foo.can\u add。要向模型添加自定义权限,可以在模型下添加类Meta:,并在那里定义权限,如下所述 我的问题是,如果我想向用户模型添加自定义权限,我应该怎么做?比如foo.can\u视图。我可以用下面的片段来做这件事 ct = ContentType.objects.get(app_

默认情况下,在django中,在安装了django.contrib.auth的情况下运行syncdb时,会在每个模型上创建默认权限。。。像foo.can\u change、foo.can\u delete和foo.can\u add。要向模型添加自定义权限,可以在模型下添加类Meta:,并在那里定义权限,如下所述

我的问题是,如果我想向用户模型添加自定义权限,我应该怎么做?比如foo.can\u视图。我可以用下面的片段来做这件事

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下面的类Meta:中使用这些,因为这是扩展用户模型的方法。但这样做对吗?这不是与UserProfile模型有关吗?

我不认为这里有一个“正确”的答案,但我使用了与您完全相同的代码,只是我将
权限.objects.create
更改为
权限.objects.get\u或\u create
和syncdb同步,您可以这样做:

在Django应用程序的
\uuuuu init\uuuuuuuuuuuuuuupy
中添加:

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)

Django 1.8的更新答案。使用信号
pre\u migrate
代替
pre\u syncdb
,因为syncdb已被弃用,如果信号会改变数据库,文档建议使用
pre\u migrate
代替
post\u migrate
。另外,
@receiver
用于将
添加用户权限
连接到信号

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)

这是一个有点黑客,但提到这里无论如何作为参考

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

所有不能很好地映射到其他模型上的权限(例如“向学生发送密码提醒电子邮件”、“生成付款对账报告”、“生成PDF收据”),实际上只与在管理区域中查看的页面相关,都会被转储到此
设置
模型上

例如,以下是模型:

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"),
        )

这些设置是否都与
设置
型号严格相关?不,这就是为什么我说这有点老套。但我现在可以在这里转储所有这些权限,Django的迁移命令将处理其余的权限,这很好。

输入
\uuuu init\uuuuuuuuuuuuuupy
并连接到
post\u syncdb
可能是个好主意,但上面的代码对我来说不起作用。我必须使用
ContentType.objects.get\u for\u model(model=auth\u models.User)
。否则,它会起作用。post_syncdb似乎不再是一个信号。如果名称更改,但代码名保持不变,则不会获取或创建另一个权限。您应该仅将代码名用作获取或创建的获取部分,并将名称置于“默认值”中。您可以在模型迁移中执行此操作:请问我必须将此代码放入哪个文件中?我原以为它是在Django早期版本的模型中设置的,但我不确定…@mcastle我把它放在了
\uuu init\uuuuuuuuuuupy
中,但是“DoesNotExist:ContentType匹配查询不存在。”错误仍然存在。我不确定你的
发送方
参数是否正确,它应该是一个应用实例,例如,“from django.apps import apps sender=apps.get\u app\u config('auth'))```