Django Create extraclass для особых людей

Я создаю регистрационную форму в 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)

Как узнать, к какому типу пользователей относится пользователь (ученик, учитель, родитель или гость)?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
24
1

Ответы 1

Вы пытаетесь сделать так, чтобы когда пользователь выбирал, скажем, «студент», он создавал экземпляр профиля пользователя, а также студент?

Если это так, вы можете использовать сигналы в своем models.py, чтобы в основном проверить, какой тип выбрал пользователь, и в зависимости от этого создать каждый экземпляр модели. Типом может быть просто строка в модели профиля пользователя, например «S» для ученика, но затем просто укажите варианты выбора в форме.

Да, я делаю именно это. Я сохраняю поле (typeOfPerson), что является пользователем (S для студента, G для гостя ...). Но проблема: когда я пытаюсь проверить, какой тип пользователя является пользователем, мне всегда приходится проверять четыре раза (если type == "S" elif "T" elif "E" elif "G"), и я хочу сократить это. Вы вообще знаете, как это сделать? P.S: Спасибо за помощь !!!

Myzel394 27.11.2018 18:15

Если вам нужно текстовое представление типа пользователя, вы можете просто использовать кортеж, определяющий различные варианты, например: 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(), который вернет часть «Студент» или «Родитель».

Mark Barrett 27.11.2018 18:32

Также обратите внимание, что Python предпочитает подчеркивание для разделения имен переменных, как указано в PEP8. Таким образом, вместо typeOfPerson будет type_of_person.

Mark Barrett 27.11.2018 18:33

Другие вопросы по теме