Есть ли способ сохранить данные о регистрации пользователя в модели в зависимости от введенных им данных?
У меня есть модель 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
Тогда это будет тривиальная задача - сделать специфическое поведение для каждого типа пользователей.