Исключение Значение: NOT NULL constraint failed: auctions_grade.grader_id
У меня есть модель "домашнее задание" и модель "оценка". Я могу безупречно добавлять новые домашние задания, но когда я пытаюсь оценить их, используя общий класс на основе createview, я получаю "Exception Value: NOT NULL constraint failed: auctions_grade.grader_id". "grader" должен быть автором/пользователем запроса (или профессором).
Models.py
class Hw_upload(models.Model):
title = models.CharField(blank=True, max_length=255, null=True)
description = models.TextField(blank=True, max_length=255, null=True)
document = models.FileField(blank=True, upload_to='documents/', null=True)
creation_date = models.DateTimeField(default=timezone.now)
hw_author = models.ForeignKey(User, on_delete=models.PROTECT, related_name="hw_author")
course_hw_upload = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course_hw_uploads", null=True)
module_hw_upload = models.ForeignKey(Module, on_delete=models.CASCADE, related_name="module_hw_uploads", null=True)
activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name="hw_uploads", null=True)
class Grade(models.Model):
score = models.PositiveIntegerField(validators=[MaxValueValidator(100)], blank=True, null=True)
comment = models.TextField(max_length=300, null=True)
creation_date = models.DateTimeField(default=timezone.now)
grader = models.ForeignKey(User, on_delete=models.PROTECT, related_name="grade_author")
graded = models.BooleanField(default=False)
course_grade = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="course_grades", null=True)
module_grade = models.ForeignKey(Module, on_delete=models.CASCADE, related_name="module_grades", null=True)
activity_grade = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name="activity_grades", null=True)
hw_upload = models.ForeignKey(Hw_upload, on_delete=models.CASCADE, related_name="grades")
Forms.py
class Hw_uploadForm(ModelForm):
class Meta:
model = Hw_upload
fields = ['title', 'description', 'document']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Title'}),
'description': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Body', 'rows':3, 'cols':15}),
}
class Hw_gradeForm(ModelForm):
class Meta:
model = Grade
fields = ['score']
widgets = {
'score': forms.NumberInput(attrs={'class': 'form-control', 'placeholder': '0-100'})
}
Views.py
# Grade homework
class GradeView(CreateView):
model = Grade
template_name = "grading.html"
form_class = Hw_gradeForm
success_url = reverse_lazy('index')
def get(self, request, *args, **kwargs):
form = Hw_gradeForm
user = request.user
grades = Grade.objects.order_by('-creation_date')
editable = Grade.score
context = {
'form': form,
}
return render(request, 'auctions/grading.html', context)
def get_success_url(self, **kwargs):
return reverse_lazy('homework_upload', args = (self.object.hw_upload.id,))
Обратная связь очень ценится!
В вашей форме отсутствуют некоторые обязательные поля. У вас есть поле grader
, которое не может быть null
, но вы никак не предоставляете его. Вы должны добавить его в бэкенде, т.е. с помощью form.instance.x
в методе post()
:
class GradeView(CreateView):
...
def post(self, request, *args, **kwargs):
form = self.get_form()
form.instance.grader = request.user
if form.is_valid():
return self.form_valid(form)
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return super().form_valid(form)