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

如何为每个slug实现分页?多层关联模型的课程分页求助

为多层关联模型的slug页面实现分页

我来帮你解决这个问题,这种多层关联模型的分页确实容易踩坑,我一步步给你讲清楚怎么做:

1. 先搞定模型关联的查询逻辑

因为你的模型层级是 Faculty > Department > StudyProgramme > Courses,没有直接的关联,所以要获取某个Faculty下的所有Courses,得用反向链式过滤来打通关联:

# 假设你的模型字段定义是这样的(如果字段名不同,替换成你自己的即可)
# Faculty模型:有slug字段
# Department模型:faculty = models.ForeignKey(Faculty, on_delete=models.CASCADE)
# StudyProgramme模型:department = models.ForeignKey(Department, on_delete=models.CASCADE)
# Courses模型:study_programme = models.ForeignKey(StudyProgramme, on_delete=models.CASCADE)

# 通过Faculty的slug筛选出对应的所有课程
target_courses = Courses.objects.filter(study_programme__department__faculty__slug=slug)

2. 结合Django分页工具实现分页功能

在视图里引入Django自带的Paginator,处理分页逻辑,同时做好异常捕获:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import get_object_or_404, render
from .models import Faculty, Courses

def faculty_courses_page(request, slug):
    # 先拿到指定slug的Faculty对象,不存在就返回404
    faculty = get_object_or_404(Faculty, slug=slug)
    
    # 筛选该学院下的所有课程,这里可以加排序规则(比如按创建时间)
    all_courses = Courses.objects.filter(
        study_programme__department__faculty=faculty
    ).order_by('-created_at')
    
    # 初始化分页器,设置每页显示1条数据
    paginator = Paginator(all_courses, 1)
    
    # 获取URL中的page参数,默认显示第1页
    page_num = request.GET.get('page')
    try:
        current_courses = paginator.page(page_num)
    except PageNotAnInteger:
        # 如果page参数不是整数,直接返回第1页
        current_courses = paginator.page(1)
    except EmptyPage:
        # 如果page参数超出总页数,返回最后一页
        current_courses = paginator.page(paginator.num_pages)
    
    # 把数据传给模板
    context = {
        'faculty': faculty,
        'courses': current_courses
    }
    return render(request, 'faculty_courses.html', context)

3. 模板里渲染课程和分页控件

在模板faculty_courses.html中,既要展示课程列表,也要添加上下页的分页链接:

<h2>{{ faculty.name }} 专属课程</h2>

<!-- 课程列表区域 -->
{% for course in courses %}
    <div class="course-card">
        <h3>{{ course.title }}</h3>
        <p>{{ course.brief_intro }}</p>
    </div>
{% empty %}
    <p>这个学院目前还没有课程哦~</p>
{% endfor %}

<!-- 分页控件 -->
<div class="pagination-bar">
    {% if courses.has_previous %}
        <a href="?page={{ courses.previous_page_number }}">← 上一页</a>
    {% endif %}
    
    <span>第 {{ courses.number }} 页 / 共 {{ courses.paginator.num_pages }} 页</span>
    
    {% if courses.has_next %}
        <a href="?page={{ courses.next_page_number }}">下一页 →</a>
    {% endif %}
</div>

4. 配置对应的URL路由

最后要在urls.py里配置接收slug参数的路由:

from django.urls import path
from .views import faculty_courses_page

urlpatterns = [
    path('faculty/<slug:slug>/', faculty_courses_page, name='faculty_courses'),
]

几个关键注意点

  • 字段名要匹配:如果你的模型中外键字段名不是示例里的faculty、department,一定要替换成自己的字段名,不然查询会报错。
  • 性能优化:如果课程数据量很大,建议用select_related或prefetch_related减少数据库查询次数,比如:
    all_courses = Courses.objects.filter(
        study_programme__department__faculty=faculty
    ).select_related('study_programme__department').order_by('-created_at')
    
  • 分页参数传递:分页是通过URL的?page=X参数实现的,模板里的链接已经自动处理了这个逻辑,不用额外配置。

这样就能完美实现每个Faculty的slug页面展示专属课程,并且每页只显示1条的分页效果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:25:31