Пользовательская модель пользователя не создает объекты - PullRequest
0 голосов
/ 28 марта 2020

Я создал модель CustomUser, и она имеет отношение к двум другим моим моделям.

class User(AbstractUser):
    is_learner = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)

class Teacher(models.Model):
    #teacher_name = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)

class Learner(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)

Они не отображаются, когда я пытаюсь создать объекты ученика и учителя в их соответствующих базах данных, как показано:

class LearnerSignUpForm(UserCreationForm):
    email = forms.EmailField()


    class Meta(UserCreationForm.Meta):
        #User = CustomUser
        model = CustomUser
        fields = ["username", "email", "password1", "password2"]
        #fields = UserCreationForm.Meta.fields + ("username", "email", "password1", "password2")

    @transaction.atomic
    def save(self, *args, **kwargs):
        user = super().save(commit=False)
        user.is_learner = True
        user.save()
        learner = Learner.objects.create(user=user)
        return user

Как получить его, чтобы сохранить в ученике и учительские столы соответственно?

1 Ответ

1 голос
/ 28 марта 2020

Добро пожаловать в StackOverflow!

Стоит отметить, что, используя model.objects.create(...), вы неявно говорите Django, что вы хотите создать объект с указанными вами значениями c и сохранить его. проверьте страницу документации здесь

Если вы хотите sh сохранить объект, для которого есть связанные элементы, вы можете создать форму и использовать ModelChoiceField, а также указать модель и значение по умолчанию. выбор с использованием choices kwarg. Примером значения выбора может быть YourUserModel.objects.all() Однако, я думаю, в вашем случае вы можете не захотеть предоставить пользователю свободу выбора, в которой было бы правильно переопределить метод save() вашей формы и создайте предполагаемую логику c.

Во-вторых, я довольно давно использовал Django и никогда не видел класс Model.Meta, используемый таким образом, так что простите меня, если я ошибаюсь, но я также думаю, вам нужен метод save() непосредственно в LearnerSignupForm, а не в классе Meta.

В-третьих, если вы правильно настроили формы, используя правильные типы полей, формы Django будет разбираться со всеми этими неприятностями и жаловаться на вас, когда вы делаете что-то не так (как правило, изящно).

Наконец, я настоятельно рекомендую прочитать страницу документов для создания новых объектов

Бесплатный код:

class LearnerSignUpForm(UserCreationForm):
    email = forms.EmailField()

    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = ["username", "email", "password1", "password2"]

    @transaction.atomic
    def save(self, *args, **kwargs):
        user = super().save(commit=False)
        user.is_learner = True
        # create the relationship between the user and learner
        learner = user.learner_set.create(user=user)
        # user.learner_set.add(learner) # usually this way with FK
        user.save()
        return user # should this return the Learner object?

Последний совет:

Постарайтесь сделать ваш код максимально читабельным! Нет причин, по которым код не может быть функциональным и красивым! И, где это возможно, вы должны делать имена классов и имен переменных как можно более подходящими, например, я бы мог использовать Student вместо Learner

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...