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, если пользователь не ассоциирован с компанией.