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.

Вернуться на верх