Есть ли способ сохранить данные о регистрации пользователя в модели в зависимости от введенных им данных?

У меня есть модель Student и модель Teacher, и я создал пользовательскую форму, которая принимает в поле email и то, является ли пользователь студентом или преподавателем. Я хотел бы сделать так, чтобы, если пользователь выбирает в форме регистрации, что он учитель, данные его нового аккаунта сохранялись в модели Teacher. Если нет, то их данные хранятся в модели "Студент". Возможно ли это сделать напрямую или мне придется изначально хранить данные в модели User, а затем передавать их в модели Student и Teacher?

Вот мой код (я не ожидал, что он будет работать, но я просто попробовал его в любом случае, и он не сработал):

class CustomSignUpForm(UserCreationForm):
    email = forms.EmailField() 
    is_teacher = forms.BooleanField(label='I am a teacher')

    class Meta:
        if is_teacher == True:
            model = Teacher
        else:
            model = Student
        fields = ['username', 'email', 'password1', 'password2', 'is_teacher']

Да, вы должны быть в состоянии сделать это, переопределив метод save().

Возможно, потребуется некоторая доработка, но в целом это то, что я бы сделал:

class CustomSignUpForm(UserCreationForm):
    email = forms.EmailField() 
    is_teacher = forms.BooleanField(label='I am a teacher')

    class Meta:
        fields = ['username', 'email', 'password1', 'password2', 'is_teacher']

    def save(self, commit=True):
        # If you **Don't** want them to also be saved in the User's table, comment these lines out
        user = super().save(commit=False)
        if commit:
            user.save()

        # I'm doing get or create only on usernames,
        #   as I don't want changing the first name to create an entirely
        #       new object with a duplicate username
        if self.cleaned_data.get('is_teacher'):
            o = Teacher.objects.get_or_create(username=self.cleaned_data.get('username'))
        else:
            o = Student.objects.get_or_create(username=self.cleaned_data.get('username'))

        # Manually set the fields
        o.email = self.cleaned_data.get('email')
        o.set_password(self.cleaned_data["password1"])

        # Possibly not needed?- / Implied by table
        # o.is_teacher = self.cleaned_data('is_teacher')

        o.save()

        return o

Думаю, вам стоит подумать о разделении двух форм регистрации.

Вполне нормально, что существуют отдельные формы регистрации и даже отдельные представления регистрации в случае, если приложение имеет два очень разных типа пользователей.

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

Я не могу написать ответ за вас, потому что здесь недостаточно контекстной информации, и это будет способствовать появлению слишком широких вопросов, однако я считаю, что если вы создадите psuedo:

class TeacherSignupView(...):
    # configure the teacher sign ups
    # use this view with the Teacher model

А затем также в тандеме, на другом url:

class StudentSignupView(...):
    # configure the student sign ups

Тогда это будет тривиальная задача - сделать специфическое поведение для каждого типа пользователей.

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