Как создать отдельные поля для обычных пользователей и пользователей-администраторов в Django?

У меня есть пользовательская модель пользователя, в которой есть поля, общие для обычного пользователя и администратора (это email [используется для входа в систему], имя и фамилия). Но я хочу предоставить дополнительные поля для обычных пользователей системы. Как мне этого добиться?

class UserAccountManager(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError('The Email field must be set')
        
        email = self.normalize_email(email)
        email = email.lower()

        user = self.model(
            email=email,
            first_name=first_name,
            last_name=last_name
        )

        user.set_password(password)
        user.save(using=self._db)

        return user    

    def create_superuser(self, email, first_name, last_name, password=None):
        user = self.create_user(email, first_name, last_name, password)

        user.is_superuser = True
        user.is_staff = True

        user.save(using=self._db)

        return user
    
   
class UserAccount(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    profile_picture = models.ImageField(default='default.jpg', upload_to='profilePictures', null=True, blank=True)


    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
        return self.email + " | " + self.first_name

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

Вы можете добавить поле user_type в вашу модель. Я могу сделать для вас пример:

USER_TYPE_DATA = (
("admin", "admin"),
("member", "member"),)

class UserAccount(AbstractBaseUser, PermissionsMixin):
    user_type = models.CharField(max_length=20, choices=USER_TYPE_DATA, default="member") #new field here
    email = models.EmailField(max_length=255, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    profile_picture = models.ImageField(default='default.jpg', 


    upload_to='profilePictures', null=True, blank=True)
    objects = UserAccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    def __str__(self):
         return self.email + " | " + self.first_name

Затем вы можете проверить, равен ли тип_пользователя тому, что вам нужно или необходимо, и все.

Я попробовал вышеприведенный код, но он создает только одну единственную таблицу как для обычных пользователей, так и для администраторов.

Это имеет смысл, это не создает две отдельные таблицы, это просто добавляет столбец is_staff, который является True для штатных пользователей, и False для нештатных пользователей.

Затем вы можете защитить представление, например, с помощью декоратора @staff_member_required:

from django.contrib.admin.views.decorators import staff_member_required


@staff_member_required
def my_view(request):
    # …
    pass

Хотя вы можете сделать отдельную таблицу для неадминистративных пользователей, я бы настоятельно рекомендовал не делать этого: это усложняет систему входа в систему, а также регистрацию пользователей.

Если вам действительно нужна отдельная таблица, вы можете сделать модель Profile и позволить UserAccount ссылаться на Profile, но я думаю, что это только усложнит дело.

Почему бы не вести одну простую таблицу, в которую админы не будут (должны) вносить дополнительные данные. Это проще.

Вернуться на верх