Как заполнить модель неформализованными данными?
У меня есть модели Student, Class и StudentClass. Я хочу, чтобы студент мог присоединиться к новому классу, введя код_класса в форму. Чтобы присоединиться к классу, идентификатор студента пользователя и код_класса сохраняются в модели StudentClass. Student_id не является полем формы, поэтому он должен быть получен путем запроса модели Student с именем пользователя и возвращением student_id.
models.py:
class StudentClass(models.Model):
class Meta:
unique_together = (('class_code', 'student_id'),)
class_code = models.ForeignKey(Class, on_delete=models.CASCADE)
student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
forms.py:
class JoinClassForm(forms.ModelForm):
class Meta:
model = StudentClass
fields = ['class_code']
views.py
@login_required
def join_class(request):
if request.method == "POST":
joinclass_form = JoinClassForm(request.POST or None)
if joinclass_form.is_valid():
formclass_code = joinclass_form.data.get('class_code')
if Class.objects.filter(class_code=formclass_code).exists():
joinclass_form.save(commit=False)
joinclass_form.student_id =
Student.objects.filter(username=request.user.username).values_list('student_id', flat=True)
joinclass_form.save()
return redirect('assignments')
else:
messages.success(request, ("This class doesn't exist!"))
else:
joinclass_form = JoinClassForm
return render(request, 'join_class.html', {'joinclass_form': joinclass_form})
Я пробовал использовать hidden_field для student_id, исключить student_id из полей формы и сохранить как commit=False, и получил ту же ошибку: IntegrityError Not NULL constraint failed. Есть ли ошибка в моем коде, которую я пропустил, или я использую неправильный метод? Заранее спасибо
Edit: Простите меня, но копирование-вставка в последнем наборе кода пошла не так, и я понятия не имею, как это исправить
Вам не нужно помещать .username в request.user. Вы можете просто сказать request.user
Спасибо всем за помощь, но теперь мне удалось это исправить
На случай, если кому-то это понадобится в будущем, я понял, что допустил 2 ошибки:
- Я неправильно сохранял свою форму в своем views.py, я пытался сохранить значение student_id в форме, а не в объекте.
https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/#the-save-method
- Я назвал свой внешний ключ в таблице StudentClass как student_id, что означало, что Django переименовывал его в student_id_id. Чтобы исправить это, я просто удалил _id из student_id в таблице StudentClass.