Ошибка при сохранении ModelFormset
Я создал веб-приложение, которое представляет набор анкет. У меня есть различные модели для Question
, Questionnaire
, Answer
и Response
, которая действует как промежуточная таблица.
Я создал modelFormset и отобразил форму, но когда я пытаюсь сохранить, я получаю ограничение нулевого значения, потому что я не передаю question_id
, но я не понимаю, как я должен это делать.
null value in column "question_id" violates not-null constraint
Models.py
class Questionnaire(models.Model):
title = models.CharField(max_length=50, blank=False, unique=True)
class Question(models.Model):
questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE)
sequence = models.IntegerField()
question = models.TextField()
class Response(models.Model):
project_name = models.ForeignKey(Project, on_delete=models.CASCADE)
questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE)
user = models.CharField(max_length=50, blank=True)
class Meta:
constraints = [
models.UniqueConstraint(fields= ['project_name','questionnaire'], name='unique_response'),
]
class Answer(models.Model):
RAG_Choices = [
('Green', 'Green'),
('Amber', 'Amber'),
('Red', 'Red')
]
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.CharField(max_length=50, blank=True, choices=RAG_Choices)
notes = models.TextField(blank=True)
response = models.ForeignKey(Response, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['question','response'], name='unique_answer'),
]
view.py
def get_questionnaire(request, project_id, questionnaire_id):
# Get the Response object for the parameters
response = Response.objects.get(
project_name_id=project_id, questionnaire_id=questionnaire_id
)
AnswerFormSet = modelformset_factory(Answer, form=AnswerForm, fields=('answer','notes',), extra=0)
answer_queryset = Answer.objects.filter(response=response
).order_by('question__sequence'
).select_related('question')
if request.method == 'POST':
form = AnswerForm(request.POST)
answers = form.save(commit=False)
answers.project_name_id = response
answers.save()
return HttpResponseRedirect(next)
else:
# Get the list of questions for which no Answer exists
new_answers = Question.objects.filter(
questionnaire__response=response
).exclude(
answer__response=response
)
# This is safe to execute every time. If all answers exist, nothing happens
for new_answer in new_answers:
Answer(question=new_answer, response=response).save()
answer_formset = AnswerFormSet(queryset=answer_queryset)
template = 'pages/' + (response.questionnaire.title).replace(" ", "_").lower() + '.html'
return render(request, template, {'formset': answer_formset})
Есть идеи, где я ошибаюсь?
Спасибо