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