Django- как добавить права доступа к профилю пользователя на основе выбранных пользователей
В моем приложении Django у меня есть модель user_profile (ниже).
Эта модель имеет is_adm булево, которое является True/False в зависимости от того, является ли пользователь "администратором":
user_profile/models.py:
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField('username', max_length=50, unique=True)
email = models.EmailField('email address', unique=True)
first_name = models.CharField(max_length=20, blank=True, null=True)
last_name = models.CharField(max_length=20, blank=True, null=True)
is_adm = models.BooleanField(default=False)
Отдельно у меня есть модель posts для записей в блоге. Для этой модели есть панель администратора.
posts/models.py:
class Posts(models.Model):
title = models.CharField(max_length=300, default='')
publish_date = models.DateField(blank=True, null=True)
author = models.CharField(max_length=300)
copy = models.TextField(blank=True, default='')
link = models.URLField(blank=True)
source = models.TextField(default='', blank=True)
published = models.BooleanField(default=False)
Я хочу, чтобы пользователи is_adm = True могли:
- добавить экземпляр модели Post в панели администратора
- удалить любой экземпляр модели Post в панели администратора
- просмотреть любой экземпляр модели Post в панели администратора
- редактировать определенные поля в
Postsпанели администратора (все поля, кроме копии и источника)
Я знаю, что в Django есть Permissions и Authorization: https://docs.djangoproject.com/en/2.2/topics/auth/default/#permissions-and-authorization
Но как мне добавить такие методы, как: has_view_permission(), has_add_permission(), has_change_permission() и has_delete_permission()...
добавляю ли я их в класс User?
Или мне нужно отредактировать файл панели администратора, чтобы иметь возможность читать и писать в Posts? posts/admin.py
Я предлагаю вам два решения. Я уверен в первом, потому что использую его в личном проекте. Однако я никогда не тестировал второй вариант.
Создать администратора-менеджера
Вы можете создать специальный менеджер администратора для вашей Posts модели и переопределить методы, которые управляют разрешениями.
Следующий код предоставляет все разрешения, если пользователь запроса имеет is_adm к True, в противном случае он предоставляет значение разрешения по умолчанию.
from django.contrib.admin import ModelAdmin, register
@register(Posts)
class PostsAdmin(ModelAdmin):
def has_add_permission(self, request):
if request.user.is_adm:
return True
return super().has_add_permission(request)
def has_view_permission(self, request, obj):
if request.user.is_adm:
return True
return super().has_view_permission(request, obj)
def has_change_permission(self, request, obj):
if request.user.is_adm:
return True
return super().has_change_permission(request, obj)
def has_delete_permission(self, request, obj):
if request.user.is_adm:
return True
return super().has_delete_permission(request, obj)
Измените своего пользователя
Другим решением может быть переопределение метода has_perm вашего пользовательского User, который наследуется от PermissionsMixin.
Следующий код должен предоставить все разрешения, если пользователь имеет is_adm на True и объект является экземпляром Posts.
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField('username', max_length=50, unique=True)
email = models.EmailField('email address', unique=True)
first_name = models.CharField(max_length=20, blank=True, null=True)
last_name = models.CharField(max_length=20, blank=True, null=True)
is_adm = models.BooleanField(default=False)
def has_perm(self, perm, obj=None):
if self.is_adm and isinstance(obj, Posts):
return True
return super().has_perm(perm, obj)