2016-08-22 9 views
2

一般的なListViewでページネーターを実装しました。私の問題は、多くのページを持つリストでは、現在のページの前後に、例えば5ページの代わりにすべてのページ番号を表示するということです。これを簡単に修正する方法はありますか?多くのページを含むDagang paginator

views.pyに:HTMLで

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

{% 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

関連する問題