Django- привязка варианта ответа к вопросу и опросу
Я пытаюсь создать несколько опросов в Django и поместить их на индексную страницу опроса. Я столкнулся с проблемой: До сих пор во всех моих опросах были вопросы с одинаковым набором вариантов ответов, поэтому в своих моделях Django я связывал ответы только с опросом, поскольку это было проще всего, и это работало. Теперь мне нужно добавить новый опрос, в котором каждый вопрос имеет разный набор вариантов ответов (если вам интересно, вот этот опрос: https://www.fresno.ucsf.edu/pediatrics/downloads/edinburghscale.pdf). Моя проблема заключается в том, что для этого нового опроса я получаю все возможные варианты ответов во всем опросе для каждого вопроса.
Как связать варианты ответов с вопросом, чтобы отображались только варианты для соответствующего вопроса? Да, я прочитал учебник по опросам Django и попробовал запросить question_id, но затем я получил ошибку типа "missing question_id", поэтому я вернулся к своему первоначальному коду. Я думаю, что правильным подходом было бы связать варианты ответов и с вопросом, и с опросом, но не уверен.
Вот моя модель:
class Questionnaire(models.Model):
name = models.CharField(max_length=255)
text = models.CharField(max_length=200)
# def get_absolute_url(self):
# return reverse('questionnaire-detail', args=[str(self.id)])
def __str__(self):
return self.name
class Question(models.Model):
text = models.CharField(max_length=200)
questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='questions')
def __str__(self):
return self.text
class Answer(models.Model):
question = models.ForeignKey(Question, models.SET_NULL, blank=True, null=True, related_name='answerlist')
questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='answers', default='')
text = models.CharField(max_length=200)
image = models.CharField(null=True, max_length=20)
image_location = models.CharField(null=True, max_length=20)
def __str__(self):
return self.text
Вот мои взгляды:
ResponseFormSet = modelformset_factory(Response, form=ResponseForm, extra=0)
if request.method == 'POST':
formset = ResponseFormSet(request.POST or None, request.FILES, form_kwargs={'user': request.user})
if formset.is_valid():
print("Formset is valid")
formset.save()
return HttpResponseRedirect(reverse ('questionnaires:questionnaire_index'))
else:
print("Formset is NOT valid")
print(formset.errors)
print(formset.non_form_errors())
questionnaire = Questionnaire.objects.get(id=questionnaire_id)
questions = Question.objects.filter(questionnaire_id=questionnaire_id)
answers = Answer.objects.filter(questionnaire_id=questionnaire_id)
return render(request, 'questionnaires/questionnaire_lec.html', {
'questions': questions,
'answers': answers,
'questionnaire': questionnaire,
})
И мой HTML:
<form method="post" action="{{ request.url }}">
{% csrf_token %}
<legend><h2>{{ questionnaire.text }}</h2></legend>
<br>
{% for question in questions %}
<h3>{{question.text}}</h3>
<label hidden="" for="id_form-{{ forloop.counter0 }}-question">Question:</label>
<select hidden="" name="form-{{ forloop.counter0 }}-question" id="id_form-{{ forloop.counter0 }}-question">
<option value="{{question.id}}" selected="">{{question.text}}</option>
</select>
<!-- <label for="id_form-{{ forloop.counter0 }}-answer">Answer:</label> -->
{% for answer in answers %}
<label for="id_form-{{ forloop.counter0 }}-answer">
<input type="radio" name="form-{{ forloop.parentloop.counter0 }}-answer" id="id_form-{{ forloop.counter0 }}-answer" value="{{answer.id}}">
{{answer.text}}
</label> <br>
{% endfor %}
<input type="hidden" name="form-{{ forloop.counter0 }}-id" value="{{ forloop.counter }}" id="id_form-{{ forloop.counter0 }}-id">
<input type="hidden" name="form-TOTAL_FORMS" value="{{questions|length}}" id="id_form-TOTAL_FORMS" />
<input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS" />
<input type="hidden" name="form-MAX_NUM_FORMS" value="{{questions|length}}" id="id_form-MAX_NUM_FORMS" />
{% endfor %}
<br />
<br />
<input type="submit" value="Submit">
</form>
{% endif %}
{% endblock %}
Заранее благодарю за любую помощь!
Вы должны использовать:
{% for answer in question.answerlist.all %}
…
{% endfor %}
Не нужно передавать в шаблон QuerySet из Answers.