Формы - Внешний ключ - ModelChoiceField - НЕ СОХРАНЯЕТ - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть 2 аккаунта, Инструктор и Студент, которые расширяют модель CustomUser. У инструкторов есть поле электронной почты. У студентов есть кнопка инструктора, которую они выбирают из выпадающего меню.

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

student.instructor_id = Instructor.objects.get(email=self.cleaned_data["instructor_id"])

, но я не уверен, в чем проблема. Пожалуйста помоги!

forms.py

class StudentSignUpForm(UserCreationForm):
    instructor_id = forms.ModelChoiceField(queryset=Instructor.objects.all())

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username', 'inGameName', 'instructor_id')
        help_texts = {
            'username': 'Required',
            'inGameName': 'Required; A name by which you can be identified',
            'instructor_id': 'Optional; Provided by your professor',
        }

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_student = True
        student = Student.objects.create(user=user)
        student.instructor_id = Instructor.objects.get(email=self.cleaned_data["instructor_id"])
        student.save()
        user.save()
        return user


class InstructorSignUpForm(UserCreationForm):
    email = forms.EmailField(label='Your Email', help_text='Required')

    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = ('username',  'inGameName', 'email')
        help_texts = {
            'username': 'Required',
            'inGameName': 'Required; A name by which you can be identified',
        }

    @transaction.atomic
    def save(self):
        user = super().save(commit=False)
        user.is_instructor = True
        instructor = Instructor.objects.create(user=user)
        instructor.email = self.cleaned_data["email"]
        instructor.save()
        user.save()
        return user

models.py

from django.contrib.auth.models import AbstractUser, UserManager as AbstractUserManager
from django.db import models


class UserManager(AbstractUserManager):
    pass


class CustomUser(AbstractUser):
    objects = UserManager()
    is_student = models.BooleanField(default=False)
    is_instructor = models.BooleanField(default=False)
    username = models.CharField(max_length=40, primary_key=True, default='')
    inGameName = models.CharField("In-Game Name", max_length=40, default='')

    USERNAME_FIELD = 'username'

class Instructor(models.Model):
    user = models.OneToOneField(CustomUser, default='USER', on_delete=models.CASCADE)

    email = models.EmailField(max_length=254, unique=True, default='')

    def __str__(self):
        return self.email


class Student(models.Model):
    user = models.OneToOneField(CustomUser, default='USER', on_delete=models.CASCADE)

    instructor_id = models.ForeignKey(Instructor, to_field='email', on_delete=models.CASCADE, default='')

...