Как создать 2 типа пользователей в Django?

Я хочу создать 2 типа пользователей в моем Django проекте, а именно Customer и Company. Оба пользователя имеют различные атрибуты для процесса регистрации. Вот мой файл user odel.py -

class UserManager(BaseUserManager):

use_in_migrations = True

def _create_user(self, email, password, **extra_fields):

    if not email:
        raise ValueError('The given email must be set')
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_user(self, email, password=None, is_staff=False, is_superuser=False, **extra_fields):
    """Create and save a regular User with the given email and password."""
    extra_fields.setdefault('is_staff', is_staff)
    extra_fields.setdefault('is_superuser', is_superuser)
    return self._create_user(email, password, **extra_fields)


class User(AbstractUser):
"""User model."""
username = None
last_name = None
first_name = None
name = models.CharField(max_length=100)
email = models.EmailField(_('email address'), unique=True)
contact = models.CharField(max_length=100)

USERNAME_FIELD = 'id'
REQUIRED_FIELDS = ['contact']

objects = UserManager() 

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

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

Вам необходимо создать две отдельные модели с внешним ключом User. И сделать отдельные Формы, добавляя любые дополнительные поля, которые вы хотите.

Вот аналогичный случай:

models.py:

class User(AbstractUser):
    first_name = None
    last_name = None
    phoneNumberRegex = RegexValidator(
        regex=r'^\+?1?\d{8,15}$', message='Enter valid phone')
    username = models.CharField(
        _('phone'),
        validators=[phoneNumberRegex],
        max_length=16,
        unique=True,
        error_messages={
            'unique': _('A user with that phone already exists.'),
        },
        help_text=_('Required. 16 characters or fewer.'),
    )
    full_name = models.CharField(
        _('full name'),
        max_length=70,
        blank=True,
        null=True,
        error_messages={
            'max_length': _('Full name max length is 70 characters.'),
        }
    )
    ...

class Worker(models.Model):
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        error_messages={
            'blank': _('Worker must have a user related to!'),
            'null': _('Worker must have a user related to!'),
        }
    )
    is_manager = models.BooleanField(
        _('manager status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this manager site.'),
    )
    ...

serializers.py:

from allauth.account.adapter import get_adapter

class CustomRegisterSerializer(serializers.ModelSerializer):
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)

    class Meta:
        model = User
        fields = ('username', 'full_name', 'password1', 'password2',
                  'is_worker')

    def get_cleaned_data(self):        
        return {
            'username': self.validated_data.get('username'),
            'full_name': full_name if full_name != "" else None,
            'password1': self.validated_data.get('password1'),
            'is_worker': self.validated_data.get('is_worker', False),
        }

    def save(self, request):
        adapter = get_adapter()
        user = adapter.new_user(request)
        self.cleaned_data = self.get_cleaned_data()
        for attr, value in self.cleaned_data.items():
            setattr(user, attr, value)
        adapter.save_user(request, user, self)
        if self.cleaned_data.get(is_worker):
            Worker.objects.create(user=user, is_manager=False) # for example
        return user
Вернуться на верх