Django按学期对应展示科目功能的逻辑与渲染方法咨询
你当前代码的问题在于模板中遍历的是当前学院下的所有科目,没有和对应学期做绑定,导致每个学期板块都会展示全部科目,无法实现分学期展示对应科目的效果,以下是完整优化方案:
优化实现步骤
1. 视图层(views.py)优化
建议使用prefetch_related预加载每个学期关联的科目,避免多次查询数据库,优化性能,修改后的SemesterView代码如下:
class SemesterView(View): def get(self, request, id): # 拿到当前选中的学院 current_course = Course.objects.get(id=id) # 预加载每个学期对应的所有科目,减少数据库查询次数 semester_list = Semester.objects.filter(faculty=current_course).prefetch_related('subject_set') return render(request, 'app/semester.html', {'current_course': current_course, 'semester_list': semester_list})
这里不需要单独查询所有科目传递到模板,Django的外键反向关联可以直接通过学期实例拿到对应科目。
2. 模板层(semester.html)修改
遍历每个学期的同时,只遍历属于当前学期的科目即可,修改后的模板代码如下:
{% extends 'app/base.html' %} {% load static %} {% block semester %} <div class="bsc-csit"> <div class="container"> <div class="row" style="margin-top:90px; padding-top:20px;"> {% for semester in semester_list %} <div class="col-md-3"> <div class="bsccsit-box"> <h3 style="color: black">{{ semester.sem }}</h3> <ul> {% for subject in semester.subject_set.all %} <li><a href="">{{ forloop.counter }}.{{ subject.subject_name }}</a></li> {% empty %} <li>当前学期暂无科目</li> {% endfor %} </ul> </div> </div> {% endfor %} </div> </div> </div> {% endblock semester %}
说明:
semester.subject_set.all就是反向查询当前学期关联的所有科目,自动过滤出属于该学期的内容forloop.counter是Django模板自带的循环计数器,自动生成1、2、3的序号,不需要写死
可选优化(模型层冗余字段处理)
你当前定义的Subject模型中faculty字段属于冗余字段,因为Semester已经关联了Course,后续可以删除该字段,需要查询科目的所属学院时通过subject.sem.faculty即可获取,减少数据冗余。
内容的提问来源于stack exchange,提问作者Ujjwol Neupane
相关产品推荐
相关产品推荐

