Как редактировать/изменять поле в модели без использования формы в django

Сейчас я создаю викторину с множественным выбором и хочу иметь возможность добавлять различные викторины с разной сложностью и иметь около 20 вопросов для каждой викторины, которую я создаю. Из этих 20 вопросов программа должна случайным образом выбрать 10 вопросов и отобразить их ОТДЕЛЬНО. Итак, в основном я получил вопросы для отображения по отдельности и создал несколько моделей, но я также хочу сохранить результаты пользователей после того, как они ответили на 10 вопросов в базе данных и сколько раз они пытались пройти один и тот же тест. Есть ли способ сделать это без использования формы?

models.py

from django.db import models
from django.contrib.auth.models import User

class Quizzes(models.Model):

    CHOICES = (
        ('Easy', 'Easy'),
        ('Medium', 'Medium'),
        ('Hard', 'Hard'),
    ) 

    name = models.CharField(max_length=200)
    quizDesc = models.TextField()
    difficulty = models.CharField(max_length=200, null=True, choices=CHOICES)

    class  Meta:
        verbose_name_plural = "Quizzes"

    def __str__(self):
        return self.name    

class QuestionList(models.Model):
    quiz = models.ForeignKey(Quizzes, on_delete=models.CASCADE)
    questNum = models.IntegerField(null=True)
    question = models.CharField(max_length=200,null=True)
    op1 = models.CharField(max_length=200,null=True)
    op2 = models.CharField(max_length=200,null=True)
    op3 = models.CharField(max_length=200,null=True)
    op4 = models.CharField(max_length=200,null=True)
    ans = models.CharField(max_length=200,null=True)

class userQuizInfo(models.Model):
    username = models.ForeignKey(User, on_delete=models.CASCADE,null=True)
    quiz = models.ForeignKey(Quizzes, on_delete=models.CASCADE,null=True)
    correct = models.IntegerField(null=True)
    wrong = models.IntegerField(null=True)
    questOrder = models.CharField(max_length=10,null=True)

views.py

questions = list(QuestionList.objects.filter(quiz_id=pk))
    questions = random.sample(questions,1)

    # userInfo = userQuizInfo.objects(pk=pk)
    # userInfo.questOrder += questions
    # userInfo.save()

    if request.method == 'POST':
        correct=0
        wrong=0

        for q in questions:
            if q.ans ==  request.POST.get(q.question):
                correct+=1
            else:
                wrong+=1

        if (correct+wrong) == 10:
            # questList = val()
            context = {
                'correct':correct,
                'wrong':wrong,
            }

            return render(request, 'results.html', context)


        context = {
            'questions':questions,
        }

        return render(request, 'questions.html', context)
    else:
        context = {
            'questions':questions,
        }

        return render(request,'questions.html',context)

В моих представлениях я в основном пытаюсь увидеть, правильно ли они получили вопрос, и если да, то сохранить его в базе данных вместе с попыткой. Например: попытка 2 на викторине 1, вопрос №2: правильно, а попытка 1 на викторине 1, вопрос №2: неправильно. Таким образом, я смогу видеть результаты по каждому вопросу каждый раз, когда они пытаются пройти тест. Я также хочу сохранить порядок, в котором вопросы показываются пользователю, поэтому в своих моделях я создал модель userQuizInfo.

questions.html

{% block page_content %}

    <h1>Questions: </h1>

    <form method='post'>
        {% csrf_token %}

        {% for q in questions %}
            <h1>{{ q.question }}</h1>
            <input type="radio" name="{{q.question}}" value="{{q.op1}}">{{q.op1}}
            <br>
            <input type="radio" name="{{q.question}}" value="{{q.op2}}">{{q.op2}}
            <br>
            <input type="radio" name="{{q.question}}" value="{{q.op3}}">{{q.op3}}
            <br>
            <input type="radio" name="{{q.question}}" value="{{q.op4}}">{{q.op4}}
        {% endfor %}

        <br>
        <button type="submit" class="btn btn-secondary">Submit</button>
    </form>

    <!-- <h1>{{ questions.question }}</h1>
    <input type="radio" name="{{questions.question}}" value="{{questions.op1}}">{{q.op1}}
    <br>
    <input type="radio" name="{{questions.question}}" value="{{questions.op2}}">{{q.op2}}
    <br>
    <input type="radio" name="{{questions.question}}" value="{{questions.op3}}">{{q.op3}}
    <br>
    <input type="radio" name="{{questions.question}}" value="{{questions.op4}}">{{q.op4}} -->

{% endblock %}

Форма могла бы сделать часть этой работы более организованной (например, генерирование подмножества вопросов и генерирование html для вопросов), но не является абсолютно необходимой

Вместо хранения UserQuizInfo я думаю, что было бы лучше просто сделать модель UserQuiz, которая хранит каждый тест отдельно (создается, когда тест предоставляется пользователю) и поля, указывающие, на какие вопросы были даны правильные или неправильные ответы (обновляются, когда пользователь отправляет тест). Таким образом, вы можете отслеживать, какие именно тесты были даны пользователям, был ли тест отправлен, и были ли вопросы отвечены правильно/неправильно. Кроме того, хранение каждого вопроса в отдельном поле вместо одного символьного поля было бы проще, если бы вы использовали поля ForeignKey к Questions и сделали бы модель более организованной в django admin; а хранение корректности вопроса в поле BooleanField позволило бы вам держать его нулевым до тех пор, пока тест не будет сдан, а затем вы можете установить его в true/false для каждого отдельного вопроса вместо хранения общего количества правильных/неправильных ответов.
. При необходимости вы также можете добавить целочисленное поле attempt_number для отслеживания того, на каком номере попытки они находятся для конкретного теста (подсчитайте количество моделей UserQuiz с одним и тем же пользователем и тестом)

P.S. Ваша модель 'Quizzes' должна называться 'Quiz', поскольку каждый объект представляет один тест, а 'QuestionList' должен быть просто 'Question', поскольку он представляет один вопрос.

Если у вас есть больше вопросов, я отвечу, когда буду доступен

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