Django:NOT NULL 约束失败:account_tutorvalidator.user_id
Django: NOT NULL constraint failed: account_tutorvalidator.user_id
我是 django 的新手,我专门为导师创建了这个“立即申请表格”,当他们提交表格时,它将出现在管理网站上,如果他们是有效的导师,我将手动检查它。如果他们是有效的导师,我会将管理站点中的 is_validated 布尔字段检查到发送表单的相应导师,以便 he/she 可以访问站点中的其他内容。但是我遇到了这个问题,当您提交表格时会出现这个问题..
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"
我的forms.py
class TutorValidationForm(forms.ModelForm):
class Meta:
model = TutorValidator
fields = ['first_name', 'last_name', 'driving_license', 'national_id']
labels = {
'national_id': _('National ID')
}
我的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
我是 django 的新手,我专门为导师创建了这个“立即申请表格”,当他们提交表格时,它将出现在管理网站上,如果他们是有效的导师,我将手动检查它。如果他们是有效的导师,我会将管理站点中的 is_validated 布尔字段检查到发送表单的相应导师,以便 he/she 可以访问站点中的其他内容。但是我遇到了这个问题,当您提交表格时会出现这个问题..
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"
我的forms.py
class TutorValidationForm(forms.ModelForm):
class Meta:
model = TutorValidator
fields = ['first_name', 'last_name', 'driving_license', 'national_id']
labels = {
'national_id': _('National ID')
}
我的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