Django校园成绩系统:如何仅展示登录学生的个人考试成绩?
解决办法:修复模型关联+过滤当前用户的考试记录
看起来你遇到的核心问题有两个:一是Exam模型的关联字段错误,导致无法正确关联到学生;二是视图没有过滤当前登录用户的考试数据,所以会显示所有学生的成绩。下面一步步来修复:
1. 修正Exam模型的学生关联
你当前的Exam模型里,student字段错误地关联到了Year模型,这完全不符合逻辑——应该关联到代表学生的StudentProfile(因为它和User是一对一绑定的)。修改models.py里的Exam类:
class Exam(models.Model): TERM_CHOICES = ( ('First Term', 'First Term'), ('Second Term', 'Second Term'), ('Third Term', 'Third Term') ) level = models.ForeignKey('Level', null=True, blank=True, on_delete=models.CASCADE) # 把关联对象从Year改为StudentProfile student = models.ForeignKey(StudentProfile, null=True, blank=True, on_delete=models.CASCADE) year = models.ForeignKey(Year, null=True, blank=True, on_delete=models.CASCADE) subject = models.ForeignKey(Subject, null=True, blank=True, on_delete=models.CASCADE) term = models.CharField(max_length=120, default="", choices=TERM_CHOICES) mid_term_score = models.PositiveSmallIntegerField(help_text='the marks scored for mid term exams') End_of_term_score = models.PositiveSmallIntegerField(help_text='the marks scored for end of term exams') class_work_score = models.PositiveSmallIntegerField(help_text='the marks scored for class work') def __str__(self): # 修复字符串拼接逻辑,subject是对象需要转成字符串 return f"{self.subject} - {self.term}"
注意:修改完模型后,别忘了执行数据库迁移命令:
python manage.py makemigrations python manage.py migrate如果之前已经有Exam数据,需要手动更新这些数据的
student字段,关联到对应的StudentProfile对象。
2. 修改视图,过滤当前登录用户的考试记录
你的StudentView用了ListView,但错误地重写了get_object方法(这个方法是给DetailView用的,用来获取单个对象)。我们需要重写get_queryset方法,只返回当前登录用户对应的考试记录:
class StudentView(LoginRequiredMixin, ListView): model = Exam template_name = 'student.html' context_object_name = 'exams' # 把名字改成exams更贴合列表的含义 def get_queryset(self): # 获取当前登录用户的StudentProfile实例 current_student = self.request.user.studentprofile # 过滤出属于该学生的所有考试记录 return Exam.objects.filter(student=current_student)
3. 模板中渲染数据
现在模板里可以通过{{ exams }}循环渲染当前学生的所有考试成绩了,比如:
{% for exam in exams %} <div class="exam-record"> <h3>{{ exam.subject }} - {{ exam.term }} ({{ exam.year }})</h3> <ul> <li>期中成绩: {{ exam.mid_term_score }}</li> <li>期末成绩: {{ exam.End_of_term_score }}</li> <li>课堂成绩: {{ exam.class_work_score }}</li> </ul> </div> {% empty %} <p>暂无考试成绩记录</p> {% endfor %}
这样修改后,登录的学生就只能看到自己的考试成绩了。
内容的提问来源于stack exchange,提问作者Yenji
相关产品推荐
相关产品推荐

