如何为同一参数名称处理多个变量(用于复选框)?

时间:2019-01-31 05:20:14

标签: python django

我正在为测验应用编写代码,每个问题有多种选择,根据我的要求,一个问题可能包含多个正确答案。我能够检查单个答案,如果其单选按钮而不是复选框。但是我需要复选框而不是广播。

所以我给了复选框以供选择。我使用了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>        

我希望,用户选择的每个选项都需要与数据库一起检查是否正确。

1 个答案:

答案 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