簡體   English   中英

如何在django中為用戶模型添加自定義權限?

[英]How to add custom permission to the User model in django?

在django中默認情況下,當安裝了django.contrib.auth運行syncdb時,它會為每個模型創建默認權限...如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模型聯系起來嗎?

你可以這樣做:

在你的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)

我不認為這里有一個“正確”的答案,但我使用了與你完全相同的代碼,除了我將Permission.objects.create更改為Permission.objects.get_or_create並且找到了與syncdb同步

Django 1.8的更新答案。 使用信號pre_migrate而不是pre_syncdb ,因為不推薦使用pre_migrate ,如果信號將改變數據庫,則文檔建議使用pre_migrate而不是post_migrate 此外, @receiver add_user_permissions用於將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)

這有點hacky,但無論如何在此提及以供參考。

我的網站有一個名為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"),
        )

這些設置中的每一個都與Setting模型嚴格相關嗎? 不,這就是為什么我說這有點hacky。 但現在我可以在這里轉儲所有這些權限,這很好,Django的遷移命令將處理其余的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM