2009-06-28 20 views
3

分で、ページングを処理するためにDjangoのobject_listを使用しています。私は私はによってページ付けしたい、ホームページでDjango:最初のページで別々にページを設定します

が、上の他のすべてのページ:私はあなたが私の問題を聞いた後、私はそれが必要だと思う場合は、適切なページネータ()クラスに移動して幸せで改ページしたい

どうすればいいですか?私は本当にそれの周りに私の頭を得ることができません。私がそれを成し遂げるためにもっとも近いものは結果の全ページが残されてしまったので、明らかに私はそれを望んでいません。

私はどんな答えにも非常に感謝しています。これ以上の情報が必要な場合はお知らせください。どうもありがとう。

ジョー

答えて

6

だけfrom django.core.paginator import Paginatorと他のどこでも、ホームページ用のビューでp = Paginator(thestuff, 7)p = Paginator(thestuff, 10)とページネータオブジェクトを作ります。どちらの場合でも、テンプレートをレンダリングするコンテキストでバインドpをバインドします。 p.object_listはどちらの場合でも適切に設定されます(そして、あなたが使用しているアプローチであると言われるでしょうか?つまり、 "Djangoのobject_list"の意味ですか?

ジャンゴdocsは(あなたが1.0以上にしていると仮定)は、優れた詳細と例があります。それを動作させることができない場合は、あなたのテンプレートとビューコードの私たち(まだ失敗した単純なバージョン)を表示できますか?

編集:問題は今、明確に示されていると、私は次のように、Djangoのコアページネータをサブクラス化することによって解決されるべきだと思う:

from django.core.paginator import Paginator, Page 

class MyPaginator(Paginator): 

    def __init__(self, **kw): 
    self.deltafirst = kw.pop('deltafirst', 0) 
    Paginator.__init__(self, **kw) 

    def page(self, number): 
    "Returns a Page object for the given 1-based page number." 
    number = self.validate_number(number) 
    if number == 1: 
     bottom = 0 
     top = self.per_page - self.deltafirst 
    else: 
     bottom = (number - 1) * self.per_page - self.deltafirst 
     top = bottom + self.per_page 
    if top + self.orphans >= self.count: 
     top = self.count 
    return Page(self.object_list[bottom:top], number, self) 

は、今まさに上記のテキストおよび例としてMyPaginatorを使用するには、Djangoの独自の使用方法を示してただし、最初のページ3をページあたりの通常の長さ(10)よりも短くするには、追加の名前付き引数deltafirst=3を使用します。したがって、最初のページ3を他のページより短くするには、名目上の長さが10で、デルタファーストで3の単一のページジェネレータを使用します。

validate_numberに問題があるかもしれませんが、私はそれらが出現するかどうかはわかりません。もしそうであれば、MyPaginatorもその方法を上書きする必要があります)。

+0

こんにちはアレックス。提案していただきありがとうございますが、問題があります。時間がある場合は、http://pastie.org/527183をご覧ください。提案した方法に似た方法を使用すると、何が起こるかがわかります。基本的に、Djangoは適切な量のページを設定しますが、2ページ目には1ページ目に表示されていると思われる行が残っています。申し訳ありませんが説明するのは難しいですが、Pastieのリンクから理解してください。誰でもこれを解決する方法がありますか? – user116170

+0

そうですね、ペストリーのリンクを見て、それは意味をなさない - 私は1つの解決策(Django 1.0のコアPaginatorの微調整されたサブクラス)を提供するために私の答えを編集しました。 –

+0

パーフェクト!それを書く時間をとってくれてありがとう。ジョー。 – user116170

1

OBJECT_LIST()関数は、リストを離れて分割するページネータを使用しています。 チャンクの「サイズ」(7対8)を変更すると、表示されます。

選択肢: 最後の選択肢はウォンキーです。それをしないでください:-)「ハッキングする」か、またはPaginatorに移動します。

ハックする ... on request> page 1、余分な行をrow_listにスニークします。私はあなたがページネータを使用して... リスト(ROW_LIST)経由リストにそれを強制し、row_list.insert(0、なし)

PAGINATE経由なしか何かを付加することができなかった推測している

ビュー+テンプレート ...あなたのビューはquerysetのrow_listをテンプレートに渡すだけです。テンプレートにページ1をチェックさせてください。そこにrow_listのサブセットのループ表示がありますか?あなたのテンプレートにそのようなロジックを持つことは幸運です。これは複雑なテンプレートを作成します。

+0

あなたの答えをありがとう。私はPythonシェルで 'Hack It'メソッドをテストしましたが、うまくいきましたので、この問題を解決する可能性も間違いありません。ジョー。 – user116170

0

これは古い質問ですが、私のような誰かがここに来て、これを見つけて私のユニットテストが問題を発見しました。

アレックスは、基本的に右であるだけでなく、それ以外の場合は、最後のページが正しくありませんself.orphans + self.deltafirst_get_num_pagesを実装することを忘れないでください。

def _get_num_pages(self): 
    """Returns the total number of pages.""" 
    if self._num_pages is None: 
     if self.count == 0 and not self.allow_empty_first_page: 
      self._num_pages = 0 
     else: 
      hits = max(1, self.count - self.orphans + self.deltafirst) 
      self._num_pages = int(ceil(hits/float(self.per_page))) 
    return self._num_pages 
num_pages = property(_get_num_pages) 

そして、ユニットテスト:私の特定のシナリオについては

def test_ads_paginator(self): 
    per_page = 10 
    num_items = 100 
    num_firstpage = 5 
    expected_num_pages = 11 

    items = range(num_items) 
    paginator = AdsPaginator(items, per_page, deltafirst=per_page-num_firstpage) 
    last_item = paginator.page(paginator.num_pages).object_list[-1] 

    self.assertEqual(len(paginator.page(1)), num_firstpage) 
    self.assertEqual(paginator.num_pages, expected_num_pages) 
    self.assertEqual(last_item, items[-1]) 
0

、私は(複数ページの文書を作成する)1つのレンダリングされたテンプレート内のオブジェクトをページ分割して探していました。私の場合、最も簡単なアプローチは、ページジェネレータを忘れて代わりにジェネレータを使用することです。

def pages_iter(): 
     page_num = 1 
     num_records = lambda x: 30 if x > 1 else 10 
     end_idx = 0 

     while True: 
      start_idx = end_idx 
      end_idx += num_records(page_num) 
      yield { 
       'number': page_num, 
       'object_list': donors[start_idx:end_idx] 
      } 

      if end_idx > donors.count() - 2: 
       break 
      page_num += 1 

あなたのページのコンテキストに{ pages: page_iter }を追加して、あなた自身の変数ページネータ持っています。 num_recordsはpage_numberをとる関数なので、実際には究極の柔軟性があります。テンプレートで

、あなたはページネータのと同じように、これを扱うことができます。

{% for page in pages %} 
    {% if page.number == 1 %} 
    {{ header }} 
    {% endif %} 

    {% for obj in page.object_list %} 
    {{ obj }} 
    {% endfor %} 
{% endfor %} 
関連する問題