Как редактировать/изменять поле в модели без использования формы в 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', поскольку он представляет один вопрос.
Если у вас есть больше вопросов, я отвечу, когда буду доступен