Изменение списка приложений администратора 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. Я хочу ограничить доступ пользователей к приложениям, если у них нет разрешения.