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
相关产品推荐
相关产品推荐

