Расширение пользовательской модели пользователя - несколько типов пользователей в Django - PullRequest
0 голосов
/ 05 января 2020

Я относительно новичок (э) в django, но очень рад изучать такую ​​универсальную среду. Я работаю над проектом, в котором у меня будет 2 типа пользователей, учетная запись 1 и учетная запись 2. У учетной записи 2 будет возможность «добавить пользователя» в свою учетную запись. Думайте о счете 2 как о компании, которая может добавлять пользователей в свою компанию.

Пока что я расширил модель пользователя generi c и создал класс для каждого из типов учетных записей, но я не уверен, правильно ли я это делаю. В конечном итоге я захочу создать форму для входа / регистрации для каждого из типов учетных записей - аналогично тому, как функционирует ziprecruiter, поэтому некоторые советы о том, как подойти к этому, были бы также замечательными, если это возможно.

class User(AbstractBaseUser, PermissionsMixin):
    email           = models.EmailField(_('email address'), unique=True)
    is_staff        = models.BooleanField(default=False)
    is_active       = models.BooleanField(default=True)
    date_joined     = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

class account1(User):
    profile         = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+', null=True)
    # account 2 fields here
    first_name      = models.TextField(max_length=30, blank=True)
    last_name       = models.TextField(max_length=30, blank=True)
    location        = models.TextField(max_length=30, blank=True)

    class Meta:
        db_table = 'account1_user'

class account2(User):
    profile = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+')
    # account2 user fields here

    class Meta:
        db_table = 'account2_user'

Я делаю это правильно? Каков наилучший подход к созданию формы входа / регистрации для каждого типа учетной записи? Каков наилучший подход к созданию модели, которая позволит пользователю пользовательского типа (если это имеет смысл)?

1 Ответ

0 голосов
/ 05 января 2020

Эмпирическое правило не имеет значения, какая логика вашего бизнеса c, всегда используйте одну модель пользователя для вашего приложения . если вам нужно несколько типов пользователей, вы можете использовать атрибуты для определения типов пользователей. Например, в моем приложении я хочу три типа пользователей, Admin, Broker и Client. Вот как мы можем это сделать.

class UserManager(BaseUserManager):

    def create_client(self, username, first_name, last_name, email, phone, password=None):
        user = self.model(
            username=username,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
            email=self.normalize_email(email)
        )
        user.set_password(password)
        user.is_client = True
        user.save(using=self.db)
        return user

    def create_reseller(self, username, first_name, last_name, email, phone, password=None):
        user = self.create_client(username, first_name, last_name, email, phone, password)
        user.is_reseller = True
        user.save()
        return user

    def create_admin(self, username, first_name, last_name, email, phone, password=None):
        user = self.create_reseller(username, first_name, last_name, email, phone, password)
        user.is_admin = True
        user.save()
        return user


    class User(AbstractBaseUser, PermissionsMixin):
        is_superuser = None

        REQUIRED_FIELDS = ["username", "first_name", "last_name", "phone"]
        EMAIL_FIELD = "email"
        USERNAME_FIELD = 'email'

        objects = UserManager()

        email = models.EmailField(unique=True)
        username = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        first_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        last_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        phone = PhoneNumberField(unique=True)

        is_admin = models.BooleanField(default=False)
        is_reseller = models.BooleanField(default=False)
        is_client = models.BooleanField(default=False)
        # storing timestamps for users.
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        added_by = models.ForeignKey("self", models.CASCADE, default=None, null=True)

Итак, что я сделал, я использую пользовательский класс UserManager, который отвечает за генерацию User объектов модели, и я реализовал методы для генерации для все типы пользователей Client, Broker и Admin.

DefaultModel фактически являются классами, которые я использую в качестве констант для установки значений по умолчанию для моделей. Вот как это выглядит:

class DefaultModel:
    MAX_LENGTH = 1000
    MYSQL_UNIQUE_LENGTH = 255

Если вы не знаете о objects в моделях, вы можете узнать об этом из Django документов. Пользовательские пользовательские модели Django Менеджеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...