How to add custom permission to the User model in django?

后端 未结 4 1037
我寻月下人不归
我寻月下人不归 2021-02-12 15:53

in django by default when syncdb is run with django.contrib.auth installed, it creates default permissions on each model... like foo.can_change , foo.can_delete and foo.can_add.

相关标签:
4条回答
  • 2021-02-12 16:25

    An updated answer for Django 1.8. The signal pre_migrate is used instead of pre_syncdb, since syncdb is deprecated and the docs recommend using pre_migrate instead of post_migrate if the signal will alter the database. Also, @receiver is used to connect add_user_permissions to the signal.

    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)
    
    0 讨论(0)
  • 2021-02-12 16:27

    I don't think there is a "right" answer here, but i used the exact same code as you except i changed Permission.objects.create to Permission.objects.get_or_create and that worked find to sync with syncdb

    0 讨论(0)
  • 2021-02-12 16:32

    You could do something like this:

    in the __init__.py of your Django app add:

    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 讨论(0)
  • 2021-02-12 16:33

    This is a bit hacky but mentioning it here anyway for reference.

    My site has a generic model called Setting, which stores various settings concerning the site I want certain users to be able to edit, without needing to go through me the developer (like registration limit, or an address, or the cost of items, etc).

    All the permissions that don't nicely map onto other models (eg "Send Password Reminder Email to Student", "Generate Payment Reconciliation Report", "Generate PDF Receipt"), which really just relate to pages that get viewed in the admin area, get dumped onto this Setting model.

    For example, here's the model:

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

    Do each of those settings strictly relate to the Setting model? No, which is why I said this is a bit hacky. But it is nice that I can now just dump all those permissions here, and Django's migration commands will take care of the rest.

    0 讨论(0)
提交回复
热议问题