Нужно реализовать прохождение теста на Django
Вот написал POST метод для прохождение тестов
class TakeTestView(DetailView):
model = TestModels
template_name = 'courses/pass_test.html'
context_object_name = 'test'
def post(self, request, *args, **kwargs):
self.object = self.get_object()
questions = self.object.questions.all()
total_questions = questions.count()
correct_answers_count = 0
for question in questions:
selected_answer_id = request.POST.get(str(question.id))
if selected_answer_id:
selected_answer = Answer.objects.get(pk=selected_answer_id)
answers = question.answers.all()
if selected_answer.is_correct1 and answers.is_correct1:
correct_answers_count += 1
elif selected_answer.is_correct2 and answers.is_correct2:
correct_answers_count += 1
elif selected_answer.is_correct3 and answers.is_correct3:
correct_answers_count += 1
elif selected_answer.is_correct4 and answers.is_correct4:
correct_answers_count += 1
score = (correct_answers_count / total_questions) * 100
test_result = Result.objects.create(user=request.user, test=self.object, score=score)
return redirect('test_result', pk=test_result.pk)
def get(self, request, pk):
test = get_object_or_404(TestModels, pk=pk)
questions = test.questions.all()
return render(request, 'courses/pass_test.html', {'test': test, 'questions': questions})
Мои модели :
class Question(models.Model):
test = models.ForeignKey(Test, verbose_name="Тест", on_delete=models.CASCADE, related_name='questions')
question_text = models.TextField("Вопрос")
num_question = models.IntegerField("Номер вопроса:", default=1)
def __str__(self):
return "Тест: " + self.test.title + ". Вопрос: №" + str(self.num_question)
class Meta:
verbose_name = 'Вопрос'
verbose_name_plural = 'Вопросы'
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
answer_text1 = models.TextField("Текст першої відповіді")
is_correct1 = models.BooleanField("Перша відповідь є правильною", default=False)
answer_text2 = models.TextField("Текст другої відповіді")
is_correct2 = models.BooleanField("Друга відповідь є правильною", default=False)
answer_text3 = models.TextField("Текст третьої відповіді")
is_correct3 = models.BooleanField("Третя відповідь є правильною", default=False)
answer_text4 = models.TextField("Текст четвертої відповіді")
is_correct4 = models.BooleanField("Четверта відповідь є правильною", default=False)
def __str__(self):
return f"Тест: {self.question.test.title}. Ответ: №{self.question.num_question}"
class Meta:
verbose_name = 'Ответ'
verbose_name_plural = 'Ответы'
for question in questions:
selected_answer_id = request.POST.get(str(question.id))
if selected_answer_id:
selected_answer = Answer.objects.get(pk=selected_answer_id)
answers = question.answers.all()
if selected_answer.is_correct1 and answers.is_correct1:
correct_answers_count += 1
elif selected_answer.is_correct2 and answers.is_correct2:
correct_answers_count += 1
elif selected_answer.is_correct3 and answers.is_correct3:
correct_answers_count += 1
elif selected_answer.is_correct4 and answers.is_correct4:
correct_answers_count += 1
Проблема скорее всего тут, я хочу что бы ответ_пользователя == правильный ответ давал + 1 бал, вот вроде сделал, не работает, ошибки не выдает, но по факту везде 0