Python 如何在django中向用户模型添加自定义权限?
默认情况下,在django中,在安装了django.contrib.auth的情况下运行syncdb时,会在每个模型上创建默认权限。。。像foo.can\u change、foo.can\u delete和foo.can\u add。要向模型添加自定义权限,可以在模型下添加类Meta:,并在那里定义权限,如下所述 我的问题是,如果我想向用户模型添加自定义权限,我应该怎么做?比如foo.can\u视图。我可以用下面的片段来做这件事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_
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'))```