Викторина Джанго. Не могу получить ответы на вопросы

Я новичок в django и не понимаю, почему на экране не отображаются ответы на вопросы (хотя сами вопросы отображаются). В исходном коде страницы тоже всё пусто. Помоги пожалуйста

модель.py

      from django.utils.translation import gettext as _


class people(models.Model):
    CHOICES_TEST_ID = (('0', 'КСС'),
                       ('1', 'Золотые правила'),
                       ('2', 'MWD'),
                       ('3', 'DD'))
    firstname = models.CharField(max_length=50, null=False)
    lastname = models.CharField(max_length=50, null=False)
    surname = models.CharField(max_length=50, null=False)
    test_id = models.CharField(max_length=10, choices=CHOICES_TEST_ID, default=0, blank=False)
    date_of_passage = models.DateField(_('Date'), auto_now_add=True)
    correct_answer = models.IntegerField(default=0)
    done = models.BooleanField('Тест сдан', default=False)

    def number_correct_answer(self):
        self.correct_answer += 1


class questions(models.Model):
    question = models.CharField('Вопрос', max_length=500, null=False)
    test_id = models.CharField('Идентификационный номер теста', max_length=2, null=False)

    def __str__(self):
        return self.question

    class Meta:
        verbose_name_plural = 'Вопросы'


class answers(models.Model):
    answer = models.CharField('Ответ', max_length=200, null=False)
    true_answer = models.BooleanField('Правильный ответ', default=False)
    question = models.ForeignKey(questions, on_delete=models.CASCADE)

    def __str__(self):
        return self.answer

    class Meta:
        verbose_name_plural = 'Ответы'

формы.py

      from .models import people, answers
from django.forms import ModelForm, TextInput, RadioSelect


class PeopleForm(ModelForm):
    class Meta:
        model = people
        fields = ['firstname', 'lastname', 'surname', 'test_id']
        widgets = {'firstname': TextInput(attrs={'class': 'firstname', 'placeholder': 'Ввод'}),
                   'lastname': TextInput(attrs={'class': 'lastname', 'placeholder': 'Ввод'}),
                   'surname': TextInput(attrs={'class': 'surname', 'placeholder': 'Ввод'}),
                   'test_id': RadioSelect()}


class AnswersForm(ModelForm):
    class Meta:
        model = answers
        fields = ['answer', 'true_answer', 'question']
        widgets = {'true_answer': RadioSelect()}

view.py

      import random
from django.shortcuts import render, redirect
from .forms import PeopleForm, AnswersForm
from django.core.cache import cache
from .models import questions, people


def first(request):
    if request.method == 'POST':
        form = PeopleForm(request.POST)
        if form.is_valid():
            cache.set('test_id', form.cleaned_data.get("test_id"))
            form.save()
            cache.set('id_people', people.objects.values_list('id', flat=True).last())
            return redirect('main')

    form = PeopleForm()

    data = {'form': form}
    return render(request, 'main/first_page.html', data)


def random_questions(test_id):
    questions_all = questions.objects.filter(test_id=test_id).values_list('pk', flat=True)
    questions_selected = set()
    while len(questions_selected) != 3:
        questions_selected = questions_selected.union(set(random.sample(sorted(questions_all), 3)))
    selected_questions = questions.objects.filter(pk__in=questions_selected, test_id=test_id)
    return selected_questions


def main(request):
    test_id = cache.get('test_id')
    selected_questions = random_questions(test_id)
    if request.method == 'POST':
        form_main = AnswersForm(request.POST)
        if form_main.is_valid():
            correct = 0
            if form_main.cleaned_data.get('true_answer'):
                correct += 1
            id_people = cache.get('id_people')
            people.objects.filter(pk=id_people).update(correct_answer=correct)
            if correct == 3:
                return redirect('done')
            if correct != 3:
                return redirect('lose')

    else:
        form_main = AnswersForm()

    data = {'selected_questions': selected_questions,
            'form': form_main}

    return render(request, 'main/main_page.html', data)


def end_lose(request):
    id_people = cache.get('id_people')
    correct_answers = people.objects.filter(pk=id_people).values('correct_answer')
    return render(request, 'main/end_page_lose.html', {'correct_answers': correct_answers})


def end_done(request):
    id_people = cache.get('id_people')
    correct_answers = people.objects.filter(pk=id_people).values('correct_answer')
    return render(request, 'main/end_page_successfully.html', {'correct_answers': correct_answers})

main.html

      {% extends 'main/base_page.html' %}

{% block title %}
Тестирование
{% endblock %}

{% block article %}

<article>
    <form method="post">
        {% csrf_token %}
        {% for question in selected_questions %}
            <h2>{{ question.question }}</h2>
            {% if form_main.question_id == question.id %}
                {{form_main.answer}}{{form_main.true_answer}}
            {% endif %}
        {% endfor %}
        <button type="submit">Далее</button>
    </form>
</article>

{% endblock %}

Я перерыл все похожие проблемы и попробовал сделать по-другому. К сожалению, результат отрицательный. Я также рассматриваю вывод не всех вопросов на одной странице, а поочередно. Но не могу придумать как это реализовать, так как мне нужны уникальные вопросы в количестве 15 из общего количества вопросов

1 ответ

Вам нужно посмотреть на свой контекст. Это то, что вы передаете:

      data = {'selected_questions': selected_questions,
        'form': form_main}

И это вы пытаетесь позвонить:

      {% if form_main.question_id == question.id %}
    {{form_main.answer}}{{form_main.true_answer}}
{% endif %}

Вы должны вызывать ключ, потому что это то, что шаблонизатор смотрит из контекста. Так что меняйте, т.е. контекст этого:

      data = {'selected_questions': selected_questions,
        'form_main': form_main}
Другие вопросы по тегам