Ограничить пользователя в сдаче теста только один раз за курс
Я хочу ограничить студента в попытках пройти определенный тест один раз за курс. Может быть несколько тестов, но каждый студент должен пройти тест только один раз. Поле студент является полем один к одному с полем пользователь
views.py имеет :-
@login_required(login_url='studentlogin')
@user_passes_test(is_student)
def start_exam_view(request,pk):
course=QMODEL.Course.objects.get(id=pk)
questions=QMODEL.Question.objects.all().filter(course=course)
""" Update Status of exam taken """
status = models.Student.objects.get(user_id=request.user.id)
status.taken_status = True
status.save()
if request.method=='POST':
pass
response= render(request,'student/start_exam.html',{'course':course,'questions':questions})
response.set_cookie('course_id',course.id)
return response
@login_required(login_url='studentlogin')
@user_passes_test(is_student)
def calculate_marks_view(request):
if request.COOKIES.get('course_id') is not None:
course_id = request.COOKIES.get('course_id')
course=QMODEL.Course.objects.get(id=course_id)
total_marks=0
questions=QMODEL.Question.objects.all().filter(course=course)
for i in range(len(questions)):
selected_ans = request.COOKIES.get(str(i+1))
actual_answer = questions[i].answer
if selected_ans == actual_answer:
total_marks = total_marks + questions[i].marks
student = models.Student.objects.get(user_id=request.user.id)
result = QMODEL.Result()
result.marks=total_marks
if result.marks >= course.cutoff_marks:
student.result_status = True
student.save()
else:
student.result_status = False
student.save()
result.exam=course
result.student=student
result.save()
return HttpResponseRedirect('view-result')
Модель викторины :-
class Course(models.Model):
course_name = models.CharField(max_length=50)
question_number = models.PositiveIntegerField()
total_marks = models.PositiveIntegerField()
cutoff_marks = models.PositiveIntegerField(default=0)
def __str__(self):
return self.course_name
class Question(models.Model):
course=models.ForeignKey(Course,on_delete=models.CASCADE)
marks=models.PositiveIntegerField()
question=models.CharField(max_length=600)
option1=models.CharField(max_length=200)
option2=models.CharField(max_length=200)
option3=models.CharField(max_length=200)
option4=models.CharField(max_length=200)
cat=(('Option1','Option1'),('Option2','Option2'),('Option3','Option3'),('Option4','Option4'))
answer=models.CharField(max_length=200,choices=cat)
class Result(models.Model):
student = models.ForeignKey(Student,on_delete=models.CASCADE)
exam = models.ForeignKey(Course,on_delete=models.CASCADE)
marks = models.PositiveIntegerField()
date = models.DateTimeField(auto_now=True)
Модель студента:
class Student(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
profile_pic= models.ImageField(upload_to='profile_pic/Student/',null=True,blank=True)
address = models.CharField(max_length=40)
mobile = models.CharField(max_length=20,null=False)
taken_status = models.BooleanField(default=False)
result_status = models.BooleanField(default=False)
@property
def get_name(self):
return self.user.first_name+" "+self.user.last_name
@property
def get_instance(self):
return self
def __str__(self):
return self.user.first_name
шаблон выглядит следующим образом:-
<table class="table table-hover" id="dev-table">
<thead>
<tr>
<th>Exam Name</th>
<th>Take Exam</th>
</tr>
</thead>
{% for t in courses %}
<tr>
<td> {{t.course_name}}</td>
<td>
{% if student.taken_status %}
<span class="text"> Already taken </span>
{% else %}
<a class="btn btn-danger btn-xs" href="{% url 'take-exam' t.id %}"><span class="glyphicon glyphicon-circle-arrow-right"></span></a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
То, что я сделал, работает только для теста по одному курсу только... как только один из экзаменов/тестов сдан, другие экзамены не могут быть сданы...
Мне нужно сделать так, чтобы студент мог попробовать множество тестов по многим предметам... но каждый тест можно попробовать только один раз...