Добро пожаловать в 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