Изменение списка приложений администратора Django и ограничение доступа пользователей к моделям

Я пытаюсь создать систему в модели django admin, где администратор может видеть все приложения в индексе django admin. Сотрудники могут видеть только ограниченные приложения. Я смог изменить индекс списка приложений для различных ролей, но для ограниченного пользователя они могут получить доступ напрямую через url.

model.py

class User(AbstractBaseUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    first_name = models.CharField(('first name'), max_length=30, null=True)
    last_name = models.CharField(('last name'), max_length=30, null=True)
    date_of_birth = models.DateField(null=True)
    date_joined = models.DateTimeField(('date joined'), auto_now_add=True)
    # avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    phone = PhoneNumberField(null=True)
    country = CountryField(null=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)
    staff = models.BooleanField(default=False)
    is_consumer = models.BooleanField(default=True)
    # premium_referral = models.CharField(('Premium Referral Code'), max_length=30, null=True,blank=True, unique=True)

    objects = UserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    def get_full_name(self):
        '''
        Returns the first_name plus the last_name, with a space in between.
        '''
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        '''
        Returns the short name for the user.
        '''
        return self.first_name

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.staff

class Credit(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    amount = models.PositiveIntegerField(default=0)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user.email

admin.py

class HideModelAdmin(admin.ModelAdmin):
    def get_model_perms(self, request):
        """
        Return empty perms dict thus hiding the model from admin index.
        """
        if not request.user.is_admin:
            return {}
        return super().get_model_perms(request)

admin.site.register(User, HideModelAdmin)
admin.site.register(Credit, HideModelAdmin)

HideModelAdmin скрывают приложения, но они не защищены, мы можем получить к ним прямой доступ через URL. Есть ли лучший способ сделать это в Django Admin. Я хочу ограничить доступ пользователей к приложениям, если у них нет разрешения.

Вернуться на верх