Я создаю регистрационную форму в Django. Вы можете выбрать между учеником, учителем, родителем или гостем. Я хочу создать дополнительные поля для каждого класса. Как лучше всего это сделать? На данный момент будет создан (пример) Студент с UserProfile (ForeignKey)
мой models.py
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name = "Benutzer")
typeOfPerson = models.CharField(max_length=1, default=None, verbose_name = "Typ", help_text = "Entweder Schüler (S), Elternteil (E), Lehrer (L) oder Gast (G)")
birth_date = models.DateField(default=None, verbose_name = "Geburtsdatum")
gender = models.CharField(max_length=1, default = "M", verbose_name = "Geschlecht")
registration_date = models.DateField(auto_now=True, verbose_name = "Registrationsdatum")
ip_address = models.CharField(max_length=31, blank=True, null=True, verbose_name = "IP-Adresse")
is_verified = models.BooleanField(default=False, verbose_name = "Ist verifiziert?", help_text = "Ist der Benutzer verifiziert? (Wird z.B.: Bei manchen Umfragen gefragt.)")
can_verify = models.BooleanField(default=False, verbose_name = "Kann verifizieren?", help_text = "Kann der Benutzer sich verifizieren? (Wenn ja, dann kann der Benutzer unter URL_ÜBER_STATIS_EINFÜGEN verifizieren.)")
private = models.BooleanField(default=False, verbose_name = "Privat", help_text = "Ist dieses Benutzerprofil privat?")
news = models.CharField(max_length=2047, blank=True, null=True)
class Meta:
ordering = ["user"]
verbose_name = "Benutzerprofil"
verbose_name_plural = "Benutzerprofile"
def __str__(self):
return "%s %s" % (self.user.first_name, self.user.last_name)
class Student(models.Model):
UserProfile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
classNumber = models.CharField(max_length=2, blank=True, null=True, verbose_name = "Klassenstufe")
parents = models.CharField(max_length=63, blank=True, null=True, verbose_name = "Eltern")
def __str__(self):
return str(self.UserProfile)
class Parent(models.Model):
UserProfile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
children = models.CharField(max_length=511, blank=True, null=True, verbose_name = "Kinder")
def __str__(self):
return str(self.UserProfile)
class Teacher(models.Model):
UserProfile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
shortName = models.CharField(max_length=3, blank=True, null=True, verbose_name = "Kürzel")
def __str__(self):
return str(self.UserProfile)
class Guest(models.Model):
UserProfile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
def __str__(self):
return str(self.UserProfile)
Как узнать, к какому типу пользователей относится пользователь (ученик, учитель, родитель или гость)?






Вы пытаетесь сделать так, чтобы когда пользователь выбирал, скажем, «студент», он создавал экземпляр профиля пользователя, а также студент?
Если это так, вы можете использовать сигналы в своем models.py, чтобы в основном проверить, какой тип выбрал пользователь, и в зависимости от этого создать каждый экземпляр модели. Типом может быть просто строка в модели профиля пользователя, например «S» для ученика, но затем просто укажите варианты выбора в форме.
Если вам нужно текстовое представление типа пользователя, вы можете просто использовать кортеж, определяющий различные варианты, например: USER_CHOICES = (('S', 'Student'), ('P', 'Parent'), ('T', 'Teacher')) Тогда ваше поле может быть: typeOfPerson = models.CharField(max_length=1, default=None, verbose_name = "Typ", choices=USER_CHOICES) Затем в вашем сигнале установите его, как я уже упоминал, и если вы хотите получить текстовый представление типа, который вы могли бы использовать: user.get_type_of_person_display(), который вернет часть «Студент» или «Родитель».
Также обратите внимание, что Python предпочитает подчеркивание для разделения имен переменных, как указано в PEP8. Таким образом, вместо typeOfPerson будет type_of_person.
Да, я делаю именно это. Я сохраняю поле (typeOfPerson), что является пользователем (S для студента, G для гостя ...). Но проблема: когда я пытаюсь проверить, какой тип пользователя является пользователем, мне всегда приходится проверять четыре раза (если type == "S" elif "T" elif "E" elif "G"), и я хочу сократить это. Вы вообще знаете, как это сделать? P.S: Спасибо за помощь !!!