代码之家  ›  专栏  ›  技术社区  ›  Kushagra Gupta

如何在Django admin中为特定用户指定查看和编辑特定区域的权限

  •  0
  • Kushagra Gupta  · 技术社区  · 2 年前

    我正在制作一个django网站,其管理页面如下所示 enter image description here

    我希望用户(内容编写者)只访问主要区域(活动、格式、组织者),而不是整个区域。到目前为止,我还没有做过任何像Content Writer这样的用户。应该授予该用户哪些权限。我应该为用户创建组(因为到目前为止,基本上有3种类型的用户,即管理员(完全访问)、内容编写器(有限访问)、基本用户(无访问权限)),还是应该在自定义用户模型中再添加一个或两个变量,以便该用户只能访问管理站点的主要区域。

    授予这些权限后,我可以提取新html页面上的主区域,并将其相应设置为:-

    Navbar中的事件、格式、组织者 这些页面的细节呈现得有些漂亮

    models.py

    from django.db import models
    from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
    
    
    # Custom User Manager
    class CustomUserManager(BaseUserManager):
        def _create_user(self, email, password, first_name, last_name=None, **extra_fields):
            if (not email):
                raise ValueError("Email Must Be Provided")
            if (not password):
                raise ValueError("Password is not Provided")
    
            user = self.model(
                email=self.normalize_email(email),
                first_name=first_name,
                last_name=last_name,
                **extra_fields
            )
    
            user.set_password(password)
            user.save(using=self._db)
    
            return user
    
        def create_user(self, email, password, first_name, last_name=None, **extra_fields):
            extra_fields.setdefault('is_staff', False)
            extra_fields.setdefault('is_active', False)
            extra_fields.setdefault('is_superuser', False)
            return self._create_user(email, password, first_name, last_name, **extra_fields)
    
        def create_superuser(self, email, password, first_name, last_name=None, **extra_fields):
            extra_fields.setdefault('is_staff', True)
            extra_fields.setdefault('is_active', True)
            extra_fields.setdefault('is_superuser', True)
    
            if extra_fields.get('is_staff') is not True:
                raise ValueError('Superuser must have is_staff=True.')
            if extra_fields.get('is_superuser') is not True:
                raise ValueError('Superuser must have is_superuser=True.')
    
            return self._create_user(email, password, first_name, last_name, **extra_fields)
    
    
    # Custom user Model
    class User(AbstractBaseUser, PermissionsMixin):
        email = models.EmailField(db_index=True, unique=True, max_length=254)
        first_name = models.CharField(max_length=255)
        last_name = models.CharField(max_length=255, null=True)
        mobile = models.CharField(max_length=50)
        address = models.CharField(max_length=250)
        # profile_pic = models.ImageField(null=True, blank=True)
    
        is_staff = models.BooleanField(default=True)
        is_active = models.BooleanField(default=True)
        is_superuser = models.BooleanField(default=False)
    
        objects = CustomUserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = ['first_name']
    
        class Meta:
            verbose_name = 'User'
            verbose_name_plural = 'Users'
    

    accounts.admin.py

    from django.contrib import admin
    from .models import User
    
    
    # Register your models here.
    class UserManager(admin.ModelAdmin):
        list_display = ['first_name', 'email', 'mobile', 'is_staff', 'is_active', 'is_superuser']
    
    
    admin.site.register(User, UserManager)
    
    

    main.admin.py

    from django.contrib import admin
    from .models import *
    
    
    # Register your models here.
    class EventManager(admin.ModelAdmin):
        list_display = [
            'event_name',
            'organiser_of_event',
            'format_of_event',
            'date_of_event',
            'registration_fees',
            'created_at',
            'updated_at',
        ]
    
    
    admin.site.register(Format)
    admin.site.register(Organiser)
    admin.site.register(Event, EventManager)
    

    有没有办法实现上述目标?如果是,请提供必要的链接或代码或一些教程

    1 回复  |  直到 2 年前
        1
  •  1
  •   Sorin Burghiu    2 年前

    我想你就快到了!是的,在django中,使用预构建的组和权限非常有用,因为它不需要进一步复杂的权限检查。

    要进行简要描述,您可以创建用户组,如您所说:

    管理员(完全访问)、内容编写器(有限访问)、基本用户(无访问权限)

    并创建权限。例如,可以调用权限 has_edit_user_access 这是分配给管理员和内容编写器的。您可以根据需要创建尽可能多的权限,并相应地将其分配给组。然后用户获得其所在组的权限。

    这是一个 useful link 这就解释了模型级权限(这是我喜欢的),但有很多方法可以做到这一点,本文列出了使用django组和权限的所有方法。当然有官方文件,但我认为这本指南做得更好。

    为了解决第二点,您当然可以为每个权限在模型上创建布尔值,但这是一种不太可扩展的方法。这真的取决于你的项目的需要!