You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:27:28