【问题标题】:Limit the user to give the test only once限制用户只进行一次测试
【发布时间】:2021-08-02 22:56:29
【问题描述】:

我想限制学生只尝试一次特定的测试。 可以有多个测验,但每个学生应该只进行一次测试。 学生字段与用户字段是一对一的

@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
    
        result.exam=course
        result.student=student
        result.save()

        return HttpResponseRedirect('view-result')

(已编辑) 我给出了我在这个中使用的模型。 使用的型号如下: 学生:~

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)

    @property
    def get_name(self):
        return self.user.first_name+" "+self.user.last_name
    @property
    def exams_taken(self):
        return [r.course for r in Result.objects.get(student=self)]
    @property
    def get_instance(self):
        return self
    def __str__(self):
        return self.user.first_name

测验:~

class Course(models.Model):
   course_name = models.CharField(max_length=50)
   question_number = models.PositiveIntegerField()
   total_marks = models.PositiveIntegerField()



   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)

我使用的考试模板如下:

<div class="container">
  <div class="panel panel-primary">
    <div class="panel-heading">
      <h6 class="panel-title">Courses</h6>
    </div>
    <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><a class="btn btn-danger btn-xs" href="{% url 'take-exam' t.id  %}"><span class="glyphicon glyphicon-circle-arrow-right"></span></a></td>




      </tr>
      {% endfor %}
    </table>
  </div>
</div>

I want to show the button only to new user

<td><a class="btn btn-danger btn-xs" href="{% url 'take-exam' t.id  %}"><span class="glyphicon glyphicon-circle-arrow-right"></span></a></td>

【问题讨论】:

  • 您存储哪个学生参加了哪个考试。即使在数据库级别,唯一约束也可以强制执行此操作。
  • 我认为您要查找的内容需要一个数据库,您需要一个用于学生的表和一个用于测验的表以及一个多对多关系,该表将生成名为 didtest 的表,然后在他进入本次考试之前,您将启动一个查询,检查他的 id 和这个测试 id 是否在 didtest 中一起找到,如果是,则阻止他进入(通过警告任何方式)否则他可以参加考试,您将引导他进入考试页面

标签: javascript python html css django


【解决方案1】:

我从您的代码示例中假设,每门课程都有一个考试,每个学生应该能够参加每门考试一次。看起来您已经有一个模型 Result 来存储学生与每个考试或课程之间的关系。您可以简单地检查用户和课程的组合是否已经存在这样的对象。

class Student(model):
  [...]
  
  @property
  def exams_taken(self):
    return [r.course for r in Result.objects.get(student=self)]

(我很确定有一种更优雅的方式来使用查询语言而不是列表理解......)

在您的模板中,您可以简单地检查每个考试是否在此列表中。

{% for t in courses %}
  <tr>
    <td> {{t.course_name}}</td>
    <td>
      {% if t in student.exams_taken %}
        <span> 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>
{% endfor %}

尚未测试代码并做了很多假设以找到完全适合您需求的解决方案更多信息,因为您当前模型的定义可能会有所帮助。

并确保您的考试视图检查学生是否已从数据库中参加考试。检查 cookie 或隐藏按钮不会阻止“有创意”的人再次参加考试。

【讨论】:

  • 我已经尝试过您的解决方案。但不知何故,它没有奏效。
  • 我添加了更多细节。可能会得到一些东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多