如何在Django的Score_by函数中保留原有功能并添加分页?
在Django的Score_by函数中添加分页功能(保留原有功能)
1. 视图层集成Django原生分页组件
直接用Django自带的Paginator和Page类即可,不用额外安装第三方库。修改你的Score_by视图函数,先保留原有筛选、排序逻辑,再嵌入分页处理:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import render def Score_by(request): # 原有逻辑:处理分数区间筛选 min_score = request.GET.get('min_score', 0) max_score = request.GET.get('max_score', 10) # 假设你的影视数据模型是Movie,score为分数字段 movies = Movie.objects.filter(score__gte=min_score, score__lte=max_score) # 原有逻辑:按分数排序(支持升降序) sort_dir = request.GET.get('sort', 'desc') movies = movies.order_by('-score' if sort_dir == 'desc' else 'score') # 新增分页逻辑 page_size = 12 # 自定义每页展示的条目数量 paginator = Paginator(movies, page_size) page_num = request.GET.get('page') try: page_obj = paginator.page(page_num) except PageNotAnInteger: # 页码非整数时返回第一页 page_obj = paginator.page(1) except EmptyPage: # 页码超出范围时返回最后一页 page_obj = paginator.page(paginator.num_pages) # 调用TMDB API:仅处理当前页的条目,减少不必要的API请求 for movie in page_obj.object_list: # 假设你有封装好的TMDB调用函数get_tmdb_details,传入影视的TMDB ID tmdb_data = get_tmdb_details(movie.tmdb_id) movie.tmdb_info = tmdb_data # 将详情挂载到对象上供模板使用 context = { 'page_obj': page_obj, 'min_score': min_score, 'max_score': max_score, 'sort': sort_dir } return render(request, 'your_template.html', context)
2. 模板层渲染分页导航
在模板中基于page_obj渲染分页控件,同时保留筛选、排序的URL参数,确保分页时不会丢失原有查询条件:
<!-- 影视列表渲染 --> <div class="movie-container"> {% for movie in page_obj %} <div class="movie-card"> <h4>{{ movie.title }}</h4> <p>本地评分:{{ movie.score }}</p> <!-- 渲染TMDB返回的详情 --> {% if movie.tmdb_info %} <p>TMDB评分:{{ movie.tmdb_info.vote_average }}</p> <img src="https://image.tmdb.org/t/p/w200{{ movie.tmdb_info.poster_path }}" alt="{{ movie.title }}海报"> {% endif %} </div> {% endfor %} </div> <!-- 分页导航栏 --> <div class="pagination-bar"> {% with request.GET.copy as query_params %} {% if page_obj.has_previous %} {% query_params.setlist 'page' page_obj.previous_page_number %} <a href="?{{ query_params.urlencode }}" class="page-btn">上一页</a> {% endif %} <span class="page-status">第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页</span> {% if page_obj.has_next %} {% query_params.setlist 'page' page_obj.next_page_number %} <a href="?{{ query_params.urlencode }}" class="page-btn">下一页</a> {% endif %} {% endwith %} </div>
3. 核心注意事项
- API调用优化:只对当前页的影视条目调用TMDB接口,避免一次性请求大量数据触发API限流,同时提升页面加载速度;
- 参数保留:分页链接必须携带原有筛选(
min_score/max_score)和排序(sort)参数,用request.GET.copy()复制现有查询参数后替换page值即可; - 异常处理:针对非法页码(非数字、超出范围)做兜底处理,避免页面崩溃。
内容的提问来源于stack exchange,提问作者user19553515
相关产品推荐
相关产品推荐

