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)
Вернуться на верх