Django: Сбой ограничения NOT NULL: account_tutorvalidator.user_id
Я новичок в django и я создал эту форму "apply now form" исключительно для тьюторов, когда они отправляют форму, она появляется на сайте администратора, и я вручную проверяю, является ли он действительным тьютором. И если они являются действительными тьюторами, я проверю поле is_validated booleanfield в админке на соответствующего тьютора, который отправил форму, так что он/она будет иметь доступ к другим вещам на сайте. Но у меня возникает проблема, что при отправке формы появляется сообщение "NOT NULL constraint failed: account_tutorvalidator.user_id"... Я искал некоторые решения, а также читал похожие вопросы здесь, но я все еще не могу понять, что делать. Может кто-нибудь помочь мне в этом?
вот мой models.py
class User(AbstractUser):
is_student = models.BooleanField(default=False)
is_tutor = models.BooleanField(default=False)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
phone_number = models.CharField(max_length=11, blank=False, null=True)
current_address = models.CharField(max_length=100, null=True)
image = models.ImageField(default='default-pic.jpg', upload_to='profile_pics')
def __str__(self):
return f'{self.first_name} {self.last_name}'
class TutorProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True,
related_name='tutor_profile')
bio = models.CharField(max_length=255, blank=True)
is_validated = models.BooleanField(default=False)
def __str__(self):
return f"{self.user.first_name} {self.user.last_name}'s Profile"
class TutorValidator(models.Model):
user = models.ForeignKey(TutorProfile, on_delete=models.CASCADE)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
dbs = models.ImageField(upload_to='dbs_pics')
driving_license = models.ImageField(upload_to='drivers_license_pics', null=True, blank=True)
national_id = models.ImageField(upload_to='national_id_pics', null=True, blank=True)
def __str__(self):
return f"{self.first_name}'s application form"
my forms.py
class TutorValidationForm(forms.ModelForm):
class Meta:
model = TutorValidator
fields = ['first_name', 'last_name', 'driving_license', 'national_id']
labels = {
'national_id': _('National ID')
}
my views.py
class TutorValidatorView(LoginRequiredMixin, FormView):
template_name = 'account/tutor_validator.html'
form_class = TutorValidationForm
success_url = '/'
Ошибка возникает потому, что TutorValidator
требует, чтобы вы установили внешний ключ профиля пользователя, который ваша форма в настоящее время не поддерживает, поэтому вам нужен способ установить его для создаваемого объекта и использовать текущего зарегистрированного пользователя (того, кто отправляет форму).
Вы можете сделать это, переопределив form_valid
. Попробуйте с:
class TutorValidatorView(LoginRequiredMixin, FormView):
...
def form_valid(self, form):
tutor_validator = form.save(commit=False)
tutor_validator.user = self.request.user.tutor_profile
tutor_validator.save()
return HttpResponseRedirect(self.get_success_url())
Обратите внимание, что у текущего пользователя уже должен быть существующий TutorProfile
. В противном случае его нужно сначала создать, чтобы подключить к TutorValidator