Я создаю приложение Django с формой регистрации. Для этого я добавляю в свою модель дополнительные поля, например:
models.py
class studentInfo(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
student_id = models.IntegerField(primary_key=True, null=False, validators=[MaxValueValidator(99999),
MinValueValidator(10000)])
major = models.CharField(max_length=500,null=True, blank=False, default= '------')
И мой forms.py
class UserReg(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email')
class StudentReg(forms.ModelForm):
class Meta:
model = studentInfo
fields = ('student_id', 'phone', 'major', 'eof', 'arc')
А вот и мой views.py
(Это определенно неверно, но я хочу добавить его, чтобы показать, что я пробовал)
def signup(request):
print("in view")
if request.POST:
print("in post")
userF = UserReg(request.POST)
studF = StudentReg(request.POST)
if userF.is_valid():
userF.save()
userInst = User.objects.get(username = userF.cleaned_data['username'])
print(userInst.username)
if studF.is_valid():
studF.save()
studInst = studentInfo.objects.get(studentInfo__student_id = studF.cleaned_data['student_id'])
studInst.user = userInst
studInst.save()
return redirect('login')
else:
print('in the user invalid')
print(userF.is_valid())
else:
userF = UserReg(request.POST)
studF = StudentReg(request.POST)
context = {'user':userF, 'student':studF}
return render(request,'accounts/signup.html', context)
РЕДАКТИРОВАТЬ: Вот файл сигналов signals.py
@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):
if created:
studentInfo.objects.create(user=instance)
signup.html
- отображение формы здесь
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Signup Student</title>
<body>
<h1>Form goes here</h1>
<form method = "POST" action="">
{% csrf_token %}
{{ userF.as_p }}
{{ studF.as_p }}
<input type="submit" value="save" />
</form>
</body>
</head>
<body>
</body>
</html>
Проблема, с которой я столкнулся, заключается в том, что Django создает пользователя, но не создает ученика. Для создания объекта ученика требуется создать уже существующего пользователя. Есть ли способ проверить обе формы и создать пользователя и учащегося при нажатии кнопки отправки?