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

Django如何按学段分组展示当前登录家长关联的学生成绩

问题分析

你当前的查询逻辑仅拉取了学生的全部成绩列表,没有按照学段维度做分组处理,因此模板只能遍历所有成绩平铺展示,无法实现按学段归类的效果。

解决方案

1. 调整视图层查询逻辑,生成分组后的成绩结构

修改Views.py的viewgrade方法,将查询到的成绩按学段分组后再传入模板:

def viewgrade(request):
    current_parent = request.user.parent
    tempstudent = Student.objects.get(parent = current_parent)
    # 先按学段排序,保证同属一个学段的成绩聚合,同时关联查询减少数据库访问次数
    all_grades = StudentGrade.objects.filter(student = tempstudent)\
        .order_by('period__id')\
        .select_related('period', 'subjects')
    
    # 构造按学段分组的字典
    grade_by_period = {}
    for grade_item in all_grades:
        period_name = grade_item.period.period
        # 学段不存在则初始化列表
        if period_name not in grade_by_period:
            grade_by_period[period_name] = []
        grade_by_period[period_name].append(grade_item)

    context = {
        'grade_by_period': grade_by_period,
    }
    return render(request, 'Information/viewgrade.html', context)

2. 调整模板代码,按分组遍历展示

修改viewgrade.html代码,先遍历学段分组,再遍历每个分组下的成绩:

{% for period, grade_list in grade_by_period.items %}
<!-- 打印学段名称 -->
<h3>{{ period }}</h3>
<table style="width:50%">
  <tr>
    <th>Subject</th>
    <th>Grade</th>
  </tr>
  {% for grade in grade_list %}
  <tr>
    <td>{{ grade.subjects.subject_name }}</td>
    <td>{{ grade.grade }}</td>
  </tr>
  {% endfor %}
</table>
<br>
{% endfor %}
补充说明
  • 如果需要控制学段的展示顺序,可给SchoolPeriod模型新增order数值字段,查询时把排序规则改为order_by('period__order')即可自定义排序
  • 若你的业务场景支持一个家长绑定多名学生,需要把Student.objects.get改为Student.objects.filter,再嵌套一层学生维度的分组即可

内容的提问来源于stack exchange,提问作者Flababu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:48:03