2016-08-22 29 views
2

我已经实现了具有泛型ListView的分页程序。我的问题是,对于许多页面的列表,它显示所有的页码,而不是显示当前页面前后的五页。有没有简单的方法来解决这个问题?有很多页面的Django分页程序

在views.py

class CarList(LoginRequiredMixin, ListView): 
model = Car 
paginate_by = 20 
在HTML

{% if is_paginated %} 
     <ul class="pagination pagination-centered"> 
      {% if page_obj.has_previous %} 
       <li><a href="/car?ordering={{ current_order }}&page=1"><<</a></li> 
       <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.previous_page_number }}"><</a></li> 
      {% endif %} 

      {% for i in paginator.page_range %} 
      <li {% if page_obj.number == i %} class="active" {% endif %}><a href="/car?ordering={{ current_order }}&page={{i}}">{{i}}</a></li> 
      {% endfor %} 

      {% if page_obj.has_next %} 
       <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.next_page_number }}">></a></li> 
       <li><a href="/car?ordering={{ current_order }}&page={{ page_obj.paginator.num_pages }}">>></a></li> 
      {% endif %} 
     </ul> 
{% endif %} 

回答

6

该算法是不是太复杂,如果我们假设可以进一步简化,如果有更多的超过11页(当前,5前,5后),我们总是会显示11个链接。现在我们有4种情况:

  1. 页数< 11:显示所有页面;
  2. 当前页面< = 6:显示前11页;
  3. 当前页面> 6和<(页数 - 6):显示当前页面,5之前和5之后;
  4. 当前页面> =(页数-6):显示最后11页。

根据以上考虑,让我们修改视图中创建一个变量来保存的页面数显示,并把它在上下文:

class CarList(LoginRequiredMixin, ListView): 
    model = Car 
    paginate_by = 20 

    def get_context_data(self, **kwargs): 
     context = super(CarList, self).get_context_data(**kwargs) 
     if not context.get('is_paginated', False): 
      return context 

     paginator = context.get('paginator') 
     num_pages = paginator.num_pages 
     current_page = context.get('page_obj') 
     page_no = current_page.number 

     if num_pages <= 11 or page_no <= 6: # case 1 and 2 
      pages = [x for x in range(1, min(num_pages + 1, 12))] 
     elif page_no > num_pages - 6: # case 4 
      pages = [x for x in range(num_pages - 10, num_pages + 1)] 
     else: # case 3 
      pages = [x for x in range(page_no - 5, page_no + 6)] 

     context.update({'pages': pages}) 
     return context 

现在,你可以简单地使用新的变量在您的模板中创建页面链接:

  (...) 
      {% for i in pages %} 
      <li {% if page_obj.number == i %} class="active" {% endif %}><a href="/car?ordering={{ current_order }}&page={{i}}">{{i}}</a></li> 
      {% endfor %} 
      (...) 
+0

谢谢!它工作,如果elif页> num_pages - 6:#情况4更改为如果elif page_no> num_pages - 6:#情况4 – Wessi

+0

啊是的,我的坏,编辑我的答案纠正错误。 – rafalmp