Я использую класс AbstractUser для расширения своего класса User. В моем классе пользователей сейчас есть 3 роли: администратор, преподаватель и выпускник. Я могу использовать is_superuser
, is_staff
для решения проблемы, однако в будущем может появиться больше ролей, и если я воспользуюсь вышеуказанным методом, добавить больше ролей лучше будет невозможно. Но если я использую дополнительное поле role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
, все выглядит нормально. Но при использовании superuser
, is_superuser = True
и роль пользователя — Выпускник.
Кстати, я работаю над проектом, использующим django, rest_framework. Я хочу, чтобы Пользователей с ролью Лектора создавал Администратор и устанавливал пароль по умолчанию, и через 24 часа с момента создания учетной записи, если Лектор не изменит пароль, учетная запись будет заблокирована, а Администратор будет иметь возобновить работу для лектора. Я написал две функции save
и check_password_expiry
, но не уверен, что они работают так, как я хочу.
Может ли кто-нибудь решить мою текущую проблему, пожалуйста?
class User(AbstractUser):
class Role(models.IntegerChoices):
ADMIN = 1, "Admin"
LECTURER = 2, "Lecturer"
ALUMNI = 3, "Alumni"
avatar = CloudinaryField(null=True)
cover = CloudinaryField(null=True)
role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
alumni = models.OneToOneField(Alumni, on_delete=models.CASCADE, null=True, blank=True)
friends = models.ManyToManyField('self', symmetrical=True, blank=True)
def save(self, *args, **kwargs):
if self.role == User.Role.LECTURER and not self.password:
self.set_password('ou@123')
super().save()
def check_password_expiry(self):
if self.role == User.Role.LECTURER:
if timezone.now() - self.date_joined > timedelta(hours=24):
self.is_active = False
self.save()
def __str__(self):
return f'{self.last_name} {self.first_name}'
Когда я создаю суперпользователя с помощью python manage.py createsuperuser
, мне не разрешено выбирать роль, поэтому значением роли суперпользователя по умолчанию теперь будет «Выпускник».
Добавьте role
в REQUIRED_FIELDS [Django-doc]:
class User(AbstractUser):
REQUIRED_FIELDS = ['role']
# …
Как сказано в документации:
Список имен полей, которые будут запрашиваться при создании пользователя с помощью команды управления
createsuperuser
. Пользователю будет предложено ввести значение для каждого из этих полей. Он должен включать любое поле, для которого пустоFalse
или неопределенное, и может включать дополнительные поля, которые вы хотите запрашивать при интерактивном создании пользователя.REQUIRED_FIELDS
не имеет эффекта в других частях Django, например, при создании пользователя в администраторе.
Суперпользователь, вероятно, должен иметь роль администратора, возможно, проще просто переопределить метод create_superuser
и жестко запрограммировать его там.
Непонятно, в чем ваша проблема. Что вы имеете в виду под «Но при использовании суперпользователя is_superuser = True и роль пользователя — Выпускник»?