Создание опроса с помощью Django

Я пытаюсь реализовать опрос в Django и столкнулся с парой проблем. Опрос состоит из двух вопросов, а варианты ответов должны быть представлены радиокнопками (пользователь может выбрать только один вариант ответа). Проблемы, с которыми я столкнулся:

  1. I am not able to show only the answer choices that belong to a specific question. For some reason I am getting all answer choices below each question. I have tried editing my models to link specific choices to a question, but still the same issue. 2)After the user clicks "Submit" they are not being directed back to the survey index page nor are their answers saved in the database.

Вот что у меня есть на данный момент для моих моделей:

User = settings.AUTH_USER_MODEL

class Questionnaire(models.Model): 
    questionnaire_name = models.CharField(max_length=255) 
    questionnaire_text = models.CharField(max_length=200)
    def get_absolute_url(self):
        return reverse('questionnaire-detail', args=[str(self.id)])

    def __str__(self):
        return self.questionnaire_name

class Question_Prompt(models.Model):
    prompt = models.CharField(max_length=200)
    questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='prompts')
    def __str__(self):
        return self.prompt

class AnswerOption(models.Model):
    q_prompt = models.ForeignKey(Question_Prompt, on_delete=models.CASCADE, related_name='answers')
    questionnaire = models.ForeignKey(Questionnaire, on_delete=models.CASCADE, related_name='responses', default='')
    answer_text = models.CharField(max_length=200)
    def __str__(self):
        return self.answer_text
 
class UserAnswer(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE) 
    questionnaire_taken = models.ForeignKey(Questionnaire, on_delete = models.CASCADE) 
    questionnaire_date = models.DateTimeField(auto_now_add=True)
    prompt_seen = models.ForeignKey(Question_Prompt, on_delete = models.CASCADE)
    answer = models.ForeignKey(AnswerOption, on_delete = models.CASCADE)
    def __str__(self):
        return '%s - %s - %s' % (self.user, self.questionnaire_taken, self.questionnaire_date)

Мое мнение:

def questionnaire_index(request):

    questionnaires = Questionnaire.objects.all()

    context = {
         "questionnaires": questionnaires,
    }

    # Render the HTML template index.html with the data in the context variable
    return render(request, 'questionnaire_index.html', context=context)

class QuestionnaireDetailView(generic.DetailView):
    model = Questionnaire
    def get_context_data(self, **kwargs):
        context = super(QuestionnaireDetailView, self).get_context_data(**kwargs)
        context['Question_Prompts'] = Questionnaire.prompts
        context['answer_options'] =  Questionnaire.responses
        return context

Для моего HTML:

<form action="" method="post">
  {% csrf_token %}
  <fieldset>
      <legend><h2>{{ questionnaire.questionnaire_text }}</h2></legend>

      {% for prompt in questionnaire.prompts.all %}
        <legend><h2>{{ prompt.prompt }}</h2></legend>
        {% for answer in questionnaire.prompts.answers.all %}
        <legend><h3> <input type="radio" name="answer" id="answer{{ forloop.counter }}" value="{{answer.id }}">
        </h3></legend>
        {% endfor %} 

      {% endfor %}
  </fieldset>
  <a>
    <input type="submit" value="Submit" href= "{% url 'questionnaire_index' %}">
  </a>  
</form>
{% endif %}

{% endblock %}

И, наконец, мои URL:

urlpatterns = [
path('', views.questionnaire_index, name='questionnaire_index'),
 path('questionnaire_detail/<int:pk>/', views.QuestionnaireDetailView.as_view(),  name='questionnaire-detail'),
]

Я не уверен, следует ли мне использовать общий вид детализации или создать свою собственную форму. Любые рекомендации и идеи будут приняты с благодарностью. Имейте в виду, что в будущем я хотел бы иметь возможность добавлять больше опросов (конечно, с аналогичным форматом множественного выбора), и чтобы пользователь мог нажать на их название и перейти к заполнению опроса.

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