Dev_nab
@Dev_nab

Django — Как сделать тестирование (вопросник) с вариантами ответов и как их хранить?

Надо сделать тест в стиле:
1. Земля имеет форму шара?
- Да - Нет

2. Комар - это насекомое?
- Да - Нет
и т.д.

Как хранить ответы, чтобы тест можно было проходить несколько раз, разными пользователями и как проверять ответы?
Подскажите в каком направлении копать (у меня есть идея, но боюсь, она громоздкая и топорная).

models.py
class Test(models.Model):
    question = models.CharField('Текст вопроса', max_length=150)
    answer = models.BooleanField('Ответ', default=False) # Да/Нет
  • Вопрос задан
  • 795 просмотров
Пригласить эксперта
Ответы на вопрос 2
syschel
@syschel
freelance/python/django/backend
models.py
class Test(models.Model):
    question = models.CharField('Текст вопроса', max_length=150)
    answer = models.BooleanField('Ответы', default=False) # Да/Нет (тут храним правильный ответ)

class ResultTests(models.Model):
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    result = models.BooleanField('Результат', default=False) # true если ответ был верный

При создании вопросов в админке, сразу указываете какой ответ верный, но выводить пользователям только "текст вопроса" и выбор Да/Нет Когда пользователь отвечает на вопросы, проверять равен ли результат поля answer с тем что выбрал пользователь. В модели ResultTests создаём новый объект, передав туда текущего пользователя, текущий вопрос и результат ответа (true - если ответил верно).
Ответ написан
@mt_max
Не претендую на истину, но в своем проекте реализовал следующие модели:
from django.conf import settings
from django.db import models
from django.utils import timezone
from django.contrib import admin


class Profile(models.Model):
    Name = models.CharField(max_length=200, verbose_name='Название теста')
    WorkTime = models.IntegerField(verbose_name='Время выполнения (мин)')
    QuestionsCount = models.IntegerField(verbose_name='Количество вопросов')
    Statisfactorily = models.IntegerField(verbose_name='Удовлетворительно')
    Good = models.IntegerField(verbose_name='Хорошо')
    Perfect = models.IntegerField(verbose_name='Отлично')

    class Meta:
        verbose_name = 'Тесты'
        verbose_name_plural = 'Тесты'



    def __str__(self):
        return self.Name


class Question(models.Model):
    ProfileId = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Тест')
    Text = models.TextField(verbose_name='Текст вопроса')
    Weight = models.FloatField(default=1, verbose_name='Вес')

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

    def __str__(self):
        return self.Text


class Answer(models.Model):
    QuestionId = models.ForeignKey(Question, on_delete=models.CASCADE)
    Text = models.CharField(max_length=300)
    IsRight = models.BooleanField()

    class Meta:
        verbose_name = 'Вариант ответа'
        verbose_name_plural = 'Варианты ответа'

    def __str__(self):
        return self.Text

class Result(models.Model):
    ProfileId = models.ForeignKey(Profile, on_delete=models.CASCADE, verbose_name='Тест')
    UserName = models.CharField(max_length=300, verbose_name="ФИО")
    DateTime = models.DateTimeField(auto_now_add=True, blank=True, verbose_name="Время завершения")
    Rating =models.FloatField(verbose_name="Проценты")

    class Meta:
        verbose_name = 'Результат'
        verbose_name_plural = 'Результаты'




class QuestionsInline(admin.TabularInline):
    model = Answer

@admin.register(Question)
class BookAdmin(admin.ModelAdmin):
    inlines = [QuestionsInline]


@admin.register(Result)
class ResultAdmin(admin.ModelAdmin):
    list_display=("ProfileId", "DateTime", "UserName", "Rating")

    def has_add_permission(self, request):
        return False
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы