【问题标题】:How can dynamically create permission in django?如何在 django 中动态创建权限?
【发布时间】:2018-01-31 14:01:06
【问题描述】:

现在我可以使用 Django 组模块创建新组。 from django.contrib.auth.models import Group 我可以为组分配权限。例如我创建了一个新组 “人力资源”

Group(name="HR").

现在我想创建类似的权限

  • can_create_hr
  • can_edit_hr

我应该能够将此权限分配给其他组。

我该怎么做?

【问题讨论】:

    标签: python django


    【解决方案1】:
    from django.db import models
    from django.contrib.auth.models import AbstractBaseUser, Group ,Permission
    
    class Role(models.Model):
        role=models.CharField(max_length=50,unique=True)
        groups = models.ManyToManyField(Permission)
    
        def __str__(self):
            return str(self.role)
    
        # def ___init__(self, name):
        #     self.name = role
    
    class User(AbstractBaseUser):
        email =models.EmailField(max_length=225,unique=True)
        name =models.CharField(max_length=225)
        created = models.DateTimeField(auto_now_add=True)
        is_active=models.BooleanField(default=True)
        role=models.ForeignKey(Role,on_delete=models.CASCADE,default=0)
    
        USERNAME_FIELD ='email'
        REQUIRED_FIELDS=['username']
    

    更多信息请访问[这里]:https://github.com/jocavinashi/Dynamic-role-in-Django-rest-framework

    【讨论】:

      【解决方案2】:

      如果你创建一个空白迁移,你可以这样做(借用上面的答案):

      def create_groups_and_permissions(apps, schema_editor):
          Group = apps.get_model('auth', 'Group')
          ContentType = apps.get_model('contenttypes', 'ContentType')
          Permission = apps.get_model('auth', 'Permission')
          emit_post_migrate_signal(2, False, 'default')  # this creates default permissions (in case this migration was run simultaneously with the creation of relevant models and you need to grab those perms)
          content_type = ContentType.objects.get(app_label='app_name', model='model_name')
          permission = Permission.objects.create(codename='can_create_hr',
                                         name='Can create HR',
                                         content_type=content_type) # creating permissions
          group = Group.objects.filter(name='HR')
          group.permissions.add(permission)
      
      class Migration(migrations.Migration):
          dependencies = [
              ('lsoa', '0001_initial'),
          ]
      
          operations = [
              migrations.RunPython(create_groups_and_permissions)
          ]
      

      【讨论】:

        【解决方案3】:

        您也可以直接创建权限并将其分配给组。只需创建权限添加权限到组

        from django.contrib.auth.models import User, Group, Permission
        from django.contrib.contenttypes.models import ContentType
        
        content_type = ContentType.objects.get(app_label='app_name', model='model_name')
        permission = Permission.objects.create(codename='can_create_hr',
                                               name='Can create HR',
                                               content_type=content_type) # creating permissions
        group = Group.objects.get(name='HR')
        group.permissions.add(permission)
        

        如果您想将此权限分配给另一个组,则只需获取权限对象并以相同方式分配即可。

        permission = Permission.objects.get(codename='can_create_hr')
        group= Group.objects.get(name='some_name')
        group.permissions.add(permission)
        

        您可以在docs阅读更多相关信息

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-18
          • 2023-03-28
          • 1970-01-01
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多