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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:36:03