Реализация ограничений типа пользователя в моем приложении Django - PullRequest
1 голос
/ 27 января 2020

Я возвращался вперед и назад между двумя учебными пособиями по созданию пользовательских пользовательских моделей:

https://simpleisbetterthancomplex.com/tutorial/2018/01/18/how-to-implement-multiple-user-types-with-django.html

и https://wsvincent.com/django-tips-custom-user-model/

Пока вот мой код:

Модель:

class CustomUser(AbstractUser):
    is_admin = models.BooleanField('admin status', default=False)
    is_areamanager = models.BooleanField('areamanager status', default=False)
    is_sitemanager = models.BooleanField('sitemanager status', default=False)

Форма:

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = CustomUser

class CustomUserChangeForm(UserChangeForm):

    class Meta(UserChangeForm.Meta):
        model = CustomUser

Администратор:

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['email', 'username',]

admin.site.register(CustomUser, CustomUserAdmin)

В этот момент я ударился об стенку. Я не уверен, в каком направлении go ограничивать доступ пользователей к контенту. Моя общая идея заключается в том, что я хочу, чтобы администраторы имели доступ ко всему, у администраторов областей был следующий уровень доступа, у менеджера сайтов - после этого, затем у обычных пользователей (false для всех логических проверок) были базовые привилегии.

Это лучший маршрут к go для такого рода реализации? Откуда мне go отсюда и почему?

1 Ответ

1 голос
/ 27 января 2020

Не расширяйте AbstractUser, пользовательские Django встроенные группы и разрешения для создания класса пользователей с различными привилегиями: https://docs.djangoproject.com/en/3.0/topics/auth/default/#groups

Если вам нужно добавить больше Информация для пользователя, распространенным шаблоном является создание UserProfile:

class UserProfile(models.Model):  
    user = models.OneToOneField(User, related_name='profile')
    address = models.CharField(max_length=140)  
    age = ...

Несколько предложений:

  • Используйте AbstractUser только в случае указания c вариантов использования (например, когда вам нужно настроить AuthenticationBackend)
  • Используйте идентификатор пользователя, а не идентификатор профиля пользователя в качестве FK в моделях (его проще получить из запросов)
  • Для основы c вариантов использования: для добавления простого логика достаточно просто добавить поле 'role' в UserProfile c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...