Django - Разные типы пользователей с разными регистрациями

Мне нужно создать два (а в дальнейшем и больше) типа пользователей: Физические лица и Компании. Когда пользователь регистрируется, он должен выбрать, к какому типу он относится. В зависимости от этого они должны заполнить различные формы, основанные на атрибутах каждого типа, и впоследствии иметь различные разрешения.

На данный момент я пытался расширить модель AbstractUser, чтобы включить булевы для каждого типа пользователя:

class User(AbstractUser):
    email = models.EmailField(unique=True)
    is_individual = models.BooleanField(default=False)
    is_company = models.BooleanField(default=False)

Затем я создал две дополнительные модели "Профиль":

class Company(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='company_profile')
    company_name = models.CharField(max_length=100, null=False, blank=True, help_text="Company name.")
    contact_email = models.EmailField(null=True,blank=True)
    
    def save(self, *args, **kwargs):
        super(Company, self).save(*args, **kwargs)
class Individual(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name='individual_profile')
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    avatar = models.ImageField(null=True)

    def save(self, *args, **kwargs):
        super(Individual, self).save(*args, **kwargs)

Я также настроил сигналы для автоматического создания профиля при создании пользователя:

@receiver(post_save, sender=User)
def create_company_profile(sender, instance, created, **kwargs):
    if instance.is_company:
        if created:
            Company.objects.create(user=instance)
    elif instance.is_individual:
        if created:
            Individual.objects.create(user=instance)
    else:
        pass

@receiver(post_save, sender=User)
def save_company_profile(sender, instance, **kwargs):
    if instance.is_company:
        instance.company_profile.save()
    elif instance.is_individual:
        instance.individual_profile.save()
    else:
        pass

Это работает, когда я добавляю пользователя через Django Admin. Если я ставлю галочку is_individual, физическое лицо добавляется в таблицу Individuals, и то же самое для Companies.

Я пытаюсь найти способ позволить пользователям делать это при регистрации. Когда они нажимают "Register as a Company", пусть они заполняют все стандартные поля User + поля Company, и сохраняют оба экземпляра User и Company.

Как к этому подойти? Спасибо!

Советую прочитать о системе аутентификации Django. Большая часть того, что вам нужно, уже встроена. Вам не нужно создавать пользовательскую модель пользователя или вообще писать много кода.

Вместо этого создайте группу и предоставьте этой группе права на чтение/создание/редактирование/удаление определенных объектов. Затем назначьте группу пользователю, чтобы дать ему эту роль. Все это можно сделать в интерфейсе администратора django.

Возможно, вам потребуется написать некоторый код, определяющий, как выглядит форма, которую они заполняют, но это должно быть относительно просто при использовании шаблона.

В качестве еще одного предложения, вы можете рассмотреть возможность того, чтобы все пользователи заполняли свое имя и фамилию, электронную почту и т.д. Даже если они представляют компанию, вы можете захотеть иметь контактную информацию для представителя компании. Объект по умолчанию User уже имеет эти поля.

Затем вы можете добавить поле company в объект пользователя клиента. Это может быть null, если пользователь не ассоциирован с компанией.

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