2016-11-01 14 views
3

私はかなりWagtailを使い始めています。私はResources(ブログ)セクションを持つサイトを作成する過程にあります。ページングを実装する方法がわからないので、投稿は5つしかありません各ページで次の5つの投稿を表示するには、次のページに移動するために番号(1,2,3など)をクリックする必要があります。Wagtailのページ分割

私は、リソース/ブログのインデックスページのページネーションセクションのための私のテンプレートでこれを持っている:

<ul class="pagination"> 
    <li><a href="#"><i class="fa fa-angle-left"></i></a></li> 
    <li class="active"><a href="#">1</a></li> 
    <li><a href="#">2</a></li> 
    <li><a href="#">3</a></li> 
    <li><a href="#"><i class="fa fa-angle-right"></i></a></li> 
</ul> 

何のコード私は、この機能を作るために組み込む必要がありますか?前もって感謝します。

答えて

8

Djangoは、この目的でモジュールdjango.core.paginatorを提供しています:https://docs.djangoproject.com/en/1.10/topics/pagination/。これをWagtail内で使用することはDjangoのドキュメントの例と非常によく似ていますが、唯一の違いは、Paginatorオブジェクトをテンプレートに渡すように設定するときは、ページモデルのget_contextメソッドを使用することですビュー関数の、テンプレート内

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 

class ResourceIndexPage(Page): 
    # ... 
    def get_context(self, request): 
     context = super(ResourceIndexPage, self).get_context(request) 

     # Get the full unpaginated listing of resource pages as a queryset - 
     # replace this with your own query as appropriate 
     all_resources = ResourcePage.objects.live() 

     paginator = Paginator(all_resources, 5) # Show 5 resources per page 

     page = request.GET.get('page') 
     try: 
      resources = paginator.page(page) 
     except PageNotAnInteger: 
      # If page is not an integer, deliver first page. 
      resources = paginator.page(1) 
     except EmptyPage: 
      # If page is out of range (e.g. 9999), deliver last page of results. 
      resources = paginator.page(paginator.num_pages) 

     # make the variable 'resources' available on the template 
     context['resources'] = resources 

     return context 

あなたは今のアイテムをループは{% for resource in resources %}を使用することができ、かつ、次のように改ページのリンクを表示::あなたのモデル定義は次のようになります

<ul class="pagination"> 
    {% if resources.has_previous %} 
    <li><a href="?page={{ resources.previous_page_number }}"><i class="fa fa-angle-left"></i></a></li> 
    {% endif %} 
    {% for page_num in resources.paginator.page_range %} 
    <li {% if page_num == resources.number %}class="active"{% endif %}><a href="?page={{ page_num }}">{{ page_num }}</a></li> 
    {% endfor %} 
    <li><a href="?page={{ resources.next_page_number }}"><i class="fa fa-angle-right"></i></a></li> 
</ul> 
+3

最後の '

  • 'の前後に次のページがある場合にのみ、次の矢印を表示するために以下を使用したことを追加しておきたいと考えています。 '{%if resources.has_next%} {%endif%}' – Kim

    +0

    ニース。これは本当にうまくいく。これを更新する方法はありますか?/ page/1/inのnice URLを使用できますか?現在、私はハッキングしていますが、かなり面倒です! – Designer023

    +0

    @ Designer023 'RoutablePageMixin'をチェックしてください:http://docs.wagtail.io/ja/v1.13.1/reference/contrib/routablepage.html – gasman

    -1

    私はこれを試してみました数回(ここでは初心者の合計)と私はそれをまだ働いていない。私のブログのインデックスはNewsIndexPage(下記)と呼ばれている:

    class NewsIndexPage(Page): 
    intro = RichTextField(blank=True) 
    
    def get_context(self, request): 
        # Update context to include only published posts, ordered by reverse-chron 
        context = super(NewsIndexPage, self).get_context(request) 
        blogpages = self.get_children().live().order_by('-first_published_at') 
        context['blogpages'] = blogpages 
        return context 
    

    私は私のページにpaginantionコードを適用する方法は?申し訳ありませんが、私はまだPythonとDjangoにそれを適用する方法を学んでいます。

    +0

    私はあなたのためにこれをお勧めします: 'デフget_context(自己、リクエスト): コンテキスト=スーパー(NewsIndexPage、自己).get_context(リクエスト) blogpagesの=のself.get_children()(生きる)ORDER_BY( ' - 。。 first_published_at ') ページネータ=ページネータ(blogpages、5)#表示ページあたり5つのリソース ページ= request.GET.get(' ページ」) 試み:PageNotAnInteger除く ブログ= paginator.page(ページ) : ブログ=ページネーター。ページ(1)EmptyPage除く : ブログ= paginator.page(paginator.num_pages) コンテキスト[ 'ブログ'] =ブログ 戻りcontext' – Kim

    +0

    をありがとう!私は今夜​​それを試してみるでしょう。私は実際に元のコードを調整しようとしましたが、間違っていることを知っていたので投稿しませんでした。あなたのコードを見て、私は理由を見る! – Steve

    3

    私はあなたがここにいることを非常に感謝します。私はそれを動作させるためにいくつかの調整を加えなければならなかった。ここでは誰もが同じ問題に遭遇場合モデルがあります:

    class NewsIndexPage(Page): 
    intro = RichTextField(blank=True) 
    
    def get_context(self, request): 
        context = super(NewsIndexPage, self).get_context(request) 
    
        # Get the full unpaginated listing of resource pages as a queryset - 
        # replace this with your own query as appropriate 
        blogpages = self.get_children().live().order_by('-first_published_at') 
    
        paginator = Paginator(blogpages, 3) # Show 3 resources per page 
    
        page = request.GET.get('page') 
        try: 
         blogpages = paginator.page(page) 
        except PageNotAnInteger: 
         # If page is not an integer, deliver first page. 
         blogpages = paginator.page(1) 
        except EmptyPage: 
         # If page is out of range (e.g. 9999), deliver last page of results. 
         blogpages = paginator.page(paginator.num_pages) 
    
        # make the variable 'resources' available on the template 
        context['blogpages'] = blogpages 
    
        return context 
    

    ...と、ここにHTMLです:

    <ul class="pagination"> 
        {% if blogpages.has_previous %} 
         <li> 
         <a href="?page={{ blogpages.previous_page_number }}"><i class="fa fa-angle-left"></i></a> 
         </li> 
        {% endif %} 
        {% for page_num in blogpages.paginator.page_range %} 
         <li {% if page_num == blogpages.number %} class="active"{% endif %}> 
         <a href="?page={{ page_num }}">{{ page_num }}</a> 
         </li> 
        {% endfor %} 
        {% if resources.has_next %} 
         <li> 
         <a href="?page={{ blogpages.next_page_number }}"><i class="fa fa-angle-right"></i></a> 
         </li> 
         {% endif %} 
        </ul> 
    

    それは魔法のように動作 - と学習曲線に追加されます!