我正在为测验应用编写代码,每个问题有多种选择,根据我的要求,一个问题可能包含多个正确答案。我能够检查单个答案,如果其单选按钮而不是复选框。但是我需要复选框而不是广播。
所以我给了复选框以供选择。我使用了request.POST.getlist('choice'),它只返回选择顺序。我无法用我的模型检查它的正确答案。
views.py
def checkanswer(request, question_id):
question = TestQuestion.objects.get(pk=question_id)
#for single answer checking(if its radio button) i used the following
#selected_choice = question.testchoice_set.get(pk=request.POST.get('choice'))
a = request.POST.getlist('choice')
#print(selected_choice.is_answer)
#if selected_choice.is_answer == 'Yes':
#return HttpResponse('Right')
return HttpResponse('Wrong')
test.html
<form action="{% url 'polls:checkanswer' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.testchoice_set.all %}
<input type="checkbox" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_opt }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>
我希望,用户选择的每个选项都需要与数据库一起检查是否正确。
答案 0 :(得分:0)
假设您的问题模型有四个选项op1至op4。然后,您可以存储四个不同的值(每个值设置为T / F),并可以像这样检查它们。
请注意,option1到option4仅存储文本,而op1到op4是布尔值,以显示该选项是否为true。 例如,如果您的答案是ABD,则将op3设置为false,将其他设置为true。 class AssessmentQuestion(models.Model):
text = models.TextField()
question_image = models.FileField(upload_to = upload_image_path_questions, null = True, blank = True)
option1 = models.CharField(blank=True, max_length=2200)
option2 = models.CharField(blank=True, max_length=2200)
option3 = models.CharField(blank=True, max_length=2200)
option4 = models.CharField(blank=True, max_length=2200)
op1 = models.BooleanField(default=False)
op2 = models.BooleanField(default=False)
op3 = models.BooleanField(default=False)
op4 = models.BooleanField(default=False)
integer_type = models.BooleanField(default=False)
single_option = models.BooleanField(default=False)
integeral_answer = models.CharField(blank=True, max_length=100)
然后在views.py中以整数形式访问模板的响应,并与op1匹配。这将适用于单个正确以及多个正确。如果您还想要一个完整的答案,那么您也可以使用它。
p = int(current_question.op1) == int(request.data.get('op1'))
q = int(current_question.op2) == int(request.data.get('op2'))
r = int(current_question.op3) == int(request.data.get('op3'))
s = int(current_question.op4) == int(request.data.get('op4'))
if(p & q& r& s):
print('answer correct')
correct = True
else:
print('Incorrect multiple answer')
correct = False