【发布时间】:2021-07-24 16:13:11
【问题描述】:
我是 Django 的新手,我正在开发测验功能。 我给用户一个创建测验的界面。它基于多步骤形式。我输入了一定数量的问题,然后点击下一步。它显示了我设置问题的字段数量。每个问题有 4 个答案,我使用单选按钮选择正确的答案。问题是当我点击提交按钮时,我不知道如何在我的视图中检索它们。就像我希望每个问题及其相应的答案正确存储在各自的模型中一样。请问各位可以吗?它很长但很容易掌握,有些细节可能会被忽略,因为它们只是字段:)
这是我的代码:
models.py
class PsychometricTest(models.Model):
DIFF_CHOICES = (
('easy', 'easy'),
('medium', 'medium'),
('hard', 'hard'),
)
internship = models.ForeignKey(Internship, on_delete=models.CASCADE)
name = models.CharField(max_length=120)
description = models.TextField()
number_of_questions = models.IntegerField()
time = models.IntegerField(help_text="Duration of the quiz in minutes")
required_score_to_pass = models.IntegerField(help_text="required score in %")
difficulty = models.CharField(max_length=6, choices=DIFF_CHOICES)
created = models.DateTimeField(auto_now_add=True)
scheduled_date_time = models.DateTimeField()
def __str__(self):
return self.name+" - "+self.topic
def get_questions(self):
return self.question_set.all()
class Question(models.Model):
text = models.CharField(max_length=200)
psychometric_test = models.ForeignKey(PsychometricTest, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.text
def get_answers(self):
return self.answer_set.all()
class Answer(models.Model):
test = models.CharField(max_length=200)
correct = models.BooleanField(default=False)
question = models.ForeignKey(Question, on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "Question: "+self.question.text+", answer: "+self.text+", correct: "+self.correct
class Result(models.Model):
psychometric_test = models.ForeignKey(PsychometricTest, on_delete=models.CASCADE)
student = models.ForeignKey(StudentUser, on_delete=models.CASCADE)
score = models.FloatField()
def __str__(self):
return self.student.user.username+": "+self.psychometric_test+", score="+self.score
add_test.html
<form style="margin-top: 20px;" action="{% url 'add_test' internship.id %}"
id="add_test_form" method="POST" >
<!--This form will contain the quiz information-->
{% csrf_token %}
<div class="step_div first" style="display: none;">
<label>Number of questions</label>
<input type="number" class="form-control" name="test_num_questions"
id="num_qu" min="1" oninput="validity.valid||(value='')" >
<script>
$('#num_qu').on('change', function(){
var num_of_qu = $('#num_qu').val();
var html = "";
for (var i = 1; i <= num_of_qu; i++) {
html += `<div class="row"><div class="form-row"><div class="form-group col-md-6">
<label>Name of question</label><input type="text" class="form-control"
name="question_text" placeholder="Question"></div></div></div>`;
for (j = 1; j < 5; j++) {
//4 answers
html += `<div class="row">
<div class="form-row">
<div class="form-group col-md-4">
<input type="text" class="form-control" name="answers_${j}" id="answer_${j}"
placeholder="Answer"><input
type="radio"
name="answer_for_qu${i}"
id="answer_${j}">
</div>
</div>
</div>`
}
}
$(".step_div.second").html(html);
});
views.py
def add_test(request, pid):
if not request.user.is_authenticated:
messages.warning(request, "Please login first")
return redirect('login')
if request.method == 'POST':
test_name = request.POST['test_name']
test_description = request.POST['test_desc']
test_num_questions = request.POST['test_num_questions']
test_duration = request.POST['test_duration']
test_threshold = request.POST['test_threshold']
test_diff_level = request.POST['test_diff_level']
test_datetime = request.POST['test_datetime']
# print(test_name)
# print(test_description)
# print(test_num_questions)
# print(test_duration)
# print(test_threshold)
# print(test_diff_level)
# print(test_datetime)
internship = Internship.objects.get(id=pid)
context = {
'internship': internship,
}
return render(request, 'add_test.html', context)
【问题讨论】:
标签: javascript python django django-models django-views