Issue
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 :
from django.db import models
from django.contrib.auth.models import AbstractUser
from .managers import UserManager
from questions.models import Question
class User( AbstractUser ) :
email = models.EmailField( verbose_name = 'Email Address', unique = True, null = False )
username = None
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
def __str__( self ) : return self.get_username()
class Student( models.Model ) :
user = models.OneToOneField( User, on_delete = models.PROTECT )
mobile = models.CharField( verbose_name = 'Mobile Number', max_length = 10, unique = True )
def __str__( self ) : return self.user.get_username()
JAVA='J'
PYTHON='P'
DATABASE='D'
OPERATING_SYSTEM='O'
NETWORKING='N'
SUBJECT_CODE = [
( JAVA,'java' ),
( PYTHON,'python' ),
( DATABASE,'database management' ),
( OPERATING_SYSTEM,'operating systems' ),
( NETWORKING,'Computer Networks' )
]
class Performance( models.Model ) :
global SUBJECT_CODE
student = models.ForeignKey( Student, on_delete = models.PROTECT )
question = models.OneToOneField( Question, on_delete = models.PROTECT, null = True )
score = models.PositiveSmallIntegerField( verbose_name = 'Score', null = True )
qno = models.PositiveSmallIntegerField( null = True )
qindex = models.IntegerField( null = True )
subject_code = models.CharField( verbose_name = 'Subject Code', max_length = 32, choices = SUBJECT_CODE, default = PYTHON, null = False )
date_appeared = models.DateField( verbose_name = 'Date of Exam', auto_now_add = True, null = False )
from django.db import models
EASY='E'
MEDIUM='M'
HARD='H'
DIFFICULTY_LEVEL=[
(EASY,'easy'),
(MEDIUM,'medium'),
(HARD,'hard')
]
A='A'
B='B'
C='C'
D='D'
CORRECT_ANSWER=[(A,'A'),(B,'B'),(C,'C'),(D,'D')]
JAVA='J'
PYTHON='P'
DATABASE='D'
OPERATING_SYSTEM='O'
NETWORKING='N'
SUBJECT_CODE=[
(JAVA,'java'),
(PYTHON,'python'),
(DATABASE,'database management'),
(OPERATING_SYSTEM,'operating systems'),
(NETWORKING,'computer networks')
]
class Question( models.Model ) :
id=models.AutoField(primary_key=True, null=False)
subcode=models.CharField(max_length=1, choices=SUBJECT_CODE,default=PYTHON,null=False)
q_string=models.CharField(max_length=512,null=False)
A=models.CharField(max_length=512,null=False)
B=models.CharField(max_length=512,null=False)
C=models.CharField(max_length=512)
D=models.CharField(max_length=512)
correct=models.CharField(max_length=1,choices=CORRECT_ANSWER,default=A,null=False)
difficulty=models.CharField(max_length=1,choices=DIFFICULTY_LEVEL, default=EASY,null=False)
def __str__(self): return self.subcode+" "+str(self.id)
Here are my views :
from django.shortcuts import render, redirect
from profiles.models import User, Student, Performance
from questions.models import Question
from random import randint
subject_codes = {
'J' : 'Java',
'P' : 'Python',
'O' : 'Operating Systems',
'N' : 'Computer Networks',
'D' : 'DBMS'
}
def initialise_test_request( request ) :
request.student = Student.objects.get( user = request.user )
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()
p = Performance.objects.get( student = request.student )
p.subject_code = request.subject_code
p.qno = 0
p.score = 0
p.qindex = randint( 0, 9 )
p.question = list( Question.objects.filter( subcode = request.subject_code ) )[ p.qindex ]
p.save()
return request
def instruction( request, subject_code = None ) :
if subject_code is not None :
request.subject_code = subject_code
request.subject = subject_codes[ subject_code ]
if request.method == 'POST' :
if 'test_start' in request.POST.keys() : request = initialise_test_request( request )
return test( request )
return render( request, 'instructions.html', {} )
def test( request ) :
try : p = request.p
except : p = Performance.objects.get( student = Student.objects.get( user = request.user ) )
if p.qno > 0 :
if request.POST[ 'option' ] == list( Question.objects.filter( subcode = p.subject_code ) )[ p.qindex ] :
p.score = p.score + 1
p.save()
if p.qno == 10 : return render( request, 'score.html', { 'score' : p.score } )
p.qno = p.qno + 1
p.qindex = randint( 0, 9 )
p.question = list( Question.objects.filter( subcode = p.subject_code ) )[ p.qindex ]
p.save()
request.p = p
return render( request, 'question.html', { 'p' : p } )
Here’s my question page :
{% extends 'common.html' %}
{% load static %}
{% block title %} TEST {% endblock %}
{% block stylesheet %}
<script type = "text/javascript">
function submitAndNext()
{
var url =
}
</script>
{% endblock %}
{% block body %}
<center>
<div>
{{ p.qno }}. {{ p.question.q_string }}<br>
</div>
</center>
<br>
<form action="" method="POST">
{% csrf_token %}
<div style="margin-left: 50px;">
<input type="radio" id="" name="option" value="A" required>
<label for="">{{ p.question.A }}</label>
<br><br>
<input type="radio" id="" name="option" value="B">
<label for="css">{{ p.question.B }}</label>
<br><br>
<input type="radio" id="" name="option" value="C">
<label for="css">{{ p.question.C }}</label>
<br><br>
<input type="radio" id="" name="option" value="D">
<label for="css">{{ p.question.D }}</label>
<br><br><br>
<input type = "hidden" name = "test_started">
<button type="submit" class="btn btn-success rounded-pill">Submit and Next</button>
</div>
</form>
{{ p.score }}
{% endblock %}
I’ve been trying different things so there might be some discrepancies.
The score is not getting updated even after clicking the correct Choice.
Solution
When an input box is checked this returns ‘on’.
Here is what you need:
in views.py
if request.method =="POST":
if request.POST.get('the_name', None) == 'on':
print(request.POST.get('option'))
if request.method =="POST":
if request.POST.get('the_name2', None) == 'on':
print(request.POST.get('option'))
in form.html
<input type="radio" name="the_name"/>
<input type="checkbox" name="the_name2"/>
Answered By – enes islam
This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0