2016-08-22 3 views
2

일반 ListView로 페이지 매기기를 구현했습니다. 내 문제는 많은 페이지가있는 목록의 경우 현재 페이지 전후 5 개 페이지 대신 모든 페이지 번호가 표시된다는 것입니다. 이 문제를 쉽게 해결할 수 있습니까? html로에서많은 페이지가 포함 된 장고 페이지 매기기

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

: 다음 views.py에서

{% 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 : # case 4가 ifif로 변경되면 작동합니다. page_no> num_pages - 6 : # case 4 – Wessi

+0

아, 내 잘못으로 수정하여 실수를 바로 잡습니다. – rafalmp