So I’m coding a test platform consisting of Multiple Choice Questions ( MCQs ) in Django. Everything is working fine but somehow I think that the radio button value from my question page is not getting fetch via POST request.
Would appreciate some help!
Here are my models :
JavaScript
x
53
53
1
from django.db import models
2
from django.contrib.auth.models import AbstractUser
3
from .managers import UserManager
4
from questions.models import Question
5
6
class User( AbstractUser ) :
7
8
email = models.EmailField( verbose_name = 'Email Address', unique = True, null = False )
9
username = None
10
11
USERNAME_FIELD = 'email'
12
REQUIRED_FIELDS = []
13
objects = UserManager()
14
15
def __str__( self ) : return self.get_username()
16
17
18
19
class Student( models.Model ) :
20
21
user = models.OneToOneField( User, on_delete = models.PROTECT )
22
mobile = models.CharField( verbose_name = 'Mobile Number', max_length = 10, unique = True )
23
24
def __str__( self ) : return self.user.get_username()
25
26
27
JAVA='J'
28
PYTHON='P'
29
DATABASE='D'
30
OPERATING_SYSTEM='O'
31
NETWORKING='N'
32
33
SUBJECT_CODE = [
34
( JAVA,'java' ),
35
( PYTHON,'python' ),
36
( DATABASE,'database management' ),
37
( OPERATING_SYSTEM,'operating systems' ),
38
( NETWORKING,'Computer Networks' )
39
]
40
41
class Performance( models.Model ) :
42
43
global SUBJECT_CODE
44
45
student = models.ForeignKey( Student, on_delete = models.PROTECT )
46
question = models.OneToOneField( Question, on_delete = models.PROTECT, null = True )
47
48
score = models.PositiveSmallIntegerField( verbose_name = 'Score', null = True )
49
qno = models.PositiveSmallIntegerField( null = True )
50
qindex = models.IntegerField( null = True )
51
subject_code = models.CharField( verbose_name = 'Subject Code', max_length = 32, choices = SUBJECT_CODE, default = PYTHON, null = False )
52
date_appeared = models.DateField( verbose_name = 'Date of Exam', auto_now_add = True, null = False )
53
JavaScript
1
55
55
1
from django.db import models
2
3
4
5
EASY='E'
6
MEDIUM='M'
7
HARD='H'
8
DIFFICULTY_LEVEL=[
9
(EASY,'easy'),
10
(MEDIUM,'medium'),
11
(HARD,'hard')
12
]
13
14
A='A'
15
B='B'
16
C='C'
17
D='D'
18
19
CORRECT_ANSWER=[(A,'A'),(B,'B'),(C,'C'),(D,'D')]
20
21
JAVA='J'
22
PYTHON='P'
23
DATABASE='D'
24
OPERATING_SYSTEM='O'
25
NETWORKING='N'
26
27
28
29
SUBJECT_CODE=[
30
(JAVA,'java'),
31
(PYTHON,'python'),
32
(DATABASE,'database management'),
33
(OPERATING_SYSTEM,'operating systems'),
34
(NETWORKING,'computer networks')
35
]
36
37
38
39
class Question( models.Model ) :
40
41
id=models.AutoField(primary_key=True, null=False)
42
subcode=models.CharField(max_length=1, choices=SUBJECT_CODE,default=PYTHON,null=False)
43
44
q_string=models.CharField(max_length=512,null=False)
45
46
A=models.CharField(max_length=512,null=False)
47
B=models.CharField(max_length=512,null=False)
48
C=models.CharField(max_length=512)
49
D=models.CharField(max_length=512)
50
51
correct=models.CharField(max_length=1,choices=CORRECT_ANSWER,default=A,null=False)
52
difficulty=models.CharField(max_length=1,choices=DIFFICULTY_LEVEL, default=EASY,null=False)
53
54
def __str__(self): return self.subcode+" "+str(self.id)
55
Here are my views :
JavaScript
1
64
64
1
from django.shortcuts import render, redirect
2
from profiles.models import User, Student, Performance
3
from questions.models import Question
4
from random import randint
5
6
subject_codes = {
7
'J' : 'Java',
8
'P' : 'Python',
9
'O' : 'Operating Systems',
10
'N' : 'Computer Networks',
11
'D' : 'DBMS'
12
}
13
14
15
def initialise_test_request( request ) :
16
17
request.student = Student.objects.get( user = request.user )
18
if Performance.objects.filter( student = request.student ).exists() is not True : Performance( student = request.student, subject_code = request.subject_code, score = 0, qno = 1 ).save()
19
20
p = Performance.objects.get( student = request.student )
21
22
p.subject_code = request.subject_code
23
p.qno = 0
24
p.score = 0
25
p.qindex = randint( 0, 9 )
26
p.question = list( Question.objects.filter( subcode = request.subject_code ) )[ p.qindex ]
27
p.save()
28
29
return request
30
31
32
def instruction( request, subject_code = None ) :
33
34
if subject_code is not None :
35
request.subject_code = subject_code
36
request.subject = subject_codes[ subject_code ]
37
38
if request.method == 'POST' :
39
40
if 'test_start' in request.POST.keys() : request = initialise_test_request( request )
41
return test( request )
42
43
return render( request, 'instructions.html', {} )
44
45
def test( request ) :
46
47
try : p = request.p
48
except : p = Performance.objects.get( student = Student.objects.get( user = request.user ) )
49
50
if p.qno > 0 :
51
if request.POST[ 'option' ] == list( Question.objects.filter( subcode = p.subject_code ) )[ p.qindex ] :
52
p.score = p.score + 1
53
p.save()
54
55
if p.qno == 10 : return render( request, 'score.html', { 'score' : p.score } )
56
57
p.qno = p.qno + 1
58
p.qindex = randint( 0, 9 )
59
p.question = list( Question.objects.filter( subcode = p.subject_code ) )[ p.qindex ]
60
p.save()
61
62
request.p = p
63
return render( request, 'question.html', { 'p' : p } )
64
Here’s my question page :
JavaScript
1
66
66
1
{% extends 'common.html' %}
2
3
{% load static %}
4
5
{% block title %} TEST {% endblock %}
6
7
{% block stylesheet %}
8
9
<script type = "text/javascript">
10
11
function submitAndNext()
12
{
13
var url =
14
}
15
16
</script>
17
18
{% endblock %}
19
20
21
22
{% block body %}
23
24
<center>
25
26
<div>
27
{{ p.qno }}. {{ p.question.q_string }}<br>
28
</div>
29
30
</center>
31
32
<br>
33
34
<form action="" method="POST">
35
{% csrf_token %}
36
37
<div style="margin-left: 50px;">
38
39
<input type="radio" id="" name="option" value="A" required>
40
<label for="">{{ p.question.A }}</label>
41
<br><br>
42
43
<input type="radio" id="" name="option" value="B">
44
<label for="css">{{ p.question.B }}</label>
45
<br><br>
46
47
<input type="radio" id="" name="option" value="C">
48
<label for="css">{{ p.question.C }}</label>
49
<br><br>
50
51
<input type="radio" id="" name="option" value="D">
52
<label for="css">{{ p.question.D }}</label>
53
<br><br><br>
54
55
<input type = "hidden" name = "test_started">
56
57
<button type="submit" class="btn btn-success rounded-pill">Submit and Next</button>
58
59
</div>
60
61
</form>
62
63
{{ p.score }}
64
65
{% endblock %}
66
I’ve been trying different things so there might be some discrepancies. The score is not getting updated even after clicking the correct Choice.
Advertisement
Answer
When an input box is checked this returns ‘on’. Here is what you need:
in views.py
JavaScript
1
7
1
if request.method =="POST":
2
if request.POST.get('the_name', None) == 'on':
3
print(request.POST.get('option'))
4
if request.method =="POST":
5
if request.POST.get('the_name2', None) == 'on':
6
print(request.POST.get('option'))
7
in form.html
JavaScript
1
4
1
<input type="radio" name="the_name"/>
2
3
<input type="checkbox" name="the_name2"/>
4