Ограничить пользователя в сдаче теста только один раз за курс

Я хочу ограничить студента в попытках пройти определенный тест один раз за курс. Может быть несколько тестов, но каждый студент должен пройти тест только один раз. Поле студент является полем один к одному с полем пользователь

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>

То, что я сделал, работает только для теста по одному курсу только... как только один из экзаменов/тестов сдан, другие экзамены не могут быть сданы...

Мне нужно сделать так, чтобы студент мог попробовать множество тестов по многим предметам... но каждый тест можно попробовать только один раз...

Вернуться на верх