Django分页元素添加页码:跳转后URL保留页码并维持分页位置
Django分页页码保留解决方案
要实现点击分页内对象链接后URL保留page参数、分页停留在对应页码的需求,只需完成以下两步修改:
1. 给对象链接拼接当前页码参数
修改分页内对象的渲染代码,在跳转URL后拼接当前的page参数。可以直接通过request.GET获取当前页码,或者用视图传递的上下文变量:
<div class="video_courses" id="block-posts"> {% for c in object_list %} {# 获取当前页码,默认值为1 #} {% with current_page=request.GET.page|default:1 %} <a class="a_hover" href="{{ c.get_absolute_url }}?page={{ current_page }}"> <div class="video_courses_block"> <div class="video_courses_block_img"><img src="{{ c.poster.url }}" alt=""></div> <div class="video_courses_block_text"> <div class="video_courses_block_text_title"><h2>[ {{ c.author }} ] {{ c.title }}</h2></div> <div class="video_courses_block_text_navigation"> <div class="video_courses_block_text_left">{{ c.category }}</div> <div class="video_courses_block_text_rig">{{ course.movie_set.count }}</div> </div> </div> </div> </a> {% endwith %} {% endfor %} </div>
2. 优化视图确保页码参数正确传递
修改视图的get_context_data方法,将当前页码存入上下文(可选,但能让模板代码更直观),同时确保异常场景下页码值正确:
class MovieShow(DetailView): model = Movie template_name = 'movies/movie_play.html' context_object_name = 'movie' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 先获取完整的对象列表,再分页 object_list = Movie.objects.filter(course__slug=self.kwargs['course_slug']) context['title'] = context['movie'] paginator = Paginator(object_list, 1) page = self.request.GET.get('page') try: paginated_list = paginator.page(page) except PageNotAnInteger: paginated_list = paginator.page(1) page = 1 except EmptyPage: paginated_list = paginator.page(paginator.num_pages) page = paginator.num_pages context['object_list'] = paginated_list context['current_page'] = page # 将当前页码传入上下文 return context
如果用视图传递的current_page变量,模板中的链接可以简化为:
<a class="a_hover" href="{{ c.get_absolute_url }}?page={{ current_page }}">
可选:分页组件兼容多GET参数(如果后续有其他参数需求)
如果以后页面需要携带其他GET参数,可修改分页链接代码,用request.GET.urlencode保留所有参数并替换page值:
<div class="pagination" id="pagination"> <span class="step-links" > {% if object_list.has_previous %} {# 复制当前GET参数,替换page值 #} {% with query_params=request.GET.copy %} {% query_params.set 'page' 1 %} <a class="page-link" href="?{{ query_params.urlencode }}"> << </a> {% query_params.set 'page' object_list.previous_page_number %} <a class="page-link" href="?{{ query_params.urlencode }}"> < </a> {% endwith %} {% endif %} <span class="current"> {{ object_list.number }} из {{ object_list.paginator.num_pages }} </span> {% if object_list.has_next %} {% with query_params=request.GET.copy %} {% query_params.set 'page' object_list.next_page_number %} <a class="page-link" href="?{{ query_params.urlencode }}"> > </a> {% query_params.set 'page' object_list.paginator.num_pages %} <a class="page-link" href="?{{ query_params.urlencode }}"> >> </a> {% endwith %} {% endif %} </span> </div>
内容的提问来源于stack exchange,提问作者Toby Willow
相关产品推荐
相关产品推荐

