Django регистрация пользователей разных типов с разными полями
Мне нужно создать двух разных пользователей: Gym
и Client
. Теоретически клиент должен быть связан связью "многие-ко-многим", поскольку он может быть записан в несколько спортзалов. Мои сомнения связаны с регистрацией пользователей. Я нашел следующее:
class User(AbstractUser):
is_gym = models.BooleanField(default=False)
is_client = models.BooleanField(default=False)
class Gym(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
user.is_gym = True
class Client(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
gyms = models.ManyToManyField(Gym, related_name='clients')
user.is_client = True
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
if instance.is_gym:
Gym.objects.create(user=instance)
elif instance.is_client:
Client.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
if instance.is_gym:
instance.gym.save()
elif instance.is_client:
instance.client.save()
Мои сомнения сводятся к двум пунктам:
- Если бы я хотел зарегистрировать пользователей кнопкой "Я тренажерный зал" или "Я клиент" с помощью этого кода, теоретически я не смог бы этого сделать, потому что
User
класс отличается, у тренажерного зала нет фамилии, например. - С этим кодом я должен создать
Gym
иClient
класс, заполняемый в более позднее время, поэтому я должен сделать вторую форму после проверки учетной записи.
Я бы перенес большую часть этой информации в модели Gym
и Client
, поскольку, как вы говорите, у тренажерного зала нет фамилии. Вы можете использовать базовую модель User
для аутентификации и установить имя пользователя на адрес электронной почты. Тогда модель Client
может иметь поля для имени, фамилии и всего остального. Модель Gym
будет иметь только поле имени.
С точки зрения управления этим, вы можете создать форму для обоих профилей и отображать одну из них в зависимости от того, нажимает ли пользователь на тренажерный зал или клиент в следующем представлении.
Для этого я советую вам сделать Gym отдельной моделью вместо модели пользователя, особенно если Gym здесь не является человеком. Затем, когда вы можете создать новую модель для Gym с мыслью, что эта модель представляет здание, то внутри этой модели вы добавляете внешний ключ для User или делаете его полем ManyToMany. Вы можете сделать его нулевым, если вы знаете, что Gym не будет постоянно иметь подключенного User (скажем, при регистрации, например, поле может не быть полем мгновенно). Для этого вы должны сделать регистрацию для базового пользователя и после регистрации предоставить пользователю выбор, хочет ли он быть Client или владеть Gym. В этом вам может помочь функция Groups и Permissions на Django