【发布时间】: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