5

私は自分のアプリで持っているクエリに対して前後のページネーションを機能させようとしています。

https://developers.google.com/appengine/docs/python/ndb/queries#cursorsの例から始めました。

この例では、現在のページの後/前のページの後続のリクエストで使用するためにテンプレートに渡すことができるカーソルを作成するために、通常の順方向/逆方向のページ付けを行うことを期待します。しかし、それが行っているのは、同じページのカーソルを最初から取得し、もう1つを最後から取得することです(私が正しく理解している場合)。

UIで使用するために、次のページの先頭にカーソルを置き、前のページの先頭にカーソルを置きます。

上記の例に基づいて、次のコードでほぼそれを取得することができました:

    curs = Cursor(urlsafe=self.request.get('cur'))

    q = MyModel.query(MyModel.usett == usett_key)
    q_forward = q.order(-MyModel.sugerida)
    q_reverse = q.order(MyModel.sugerida)

    ofus, next_curs, more = q_forward.fetch_page(num_items_page,
                                                 start_cursor=curs)

    rev_cursor = curs.reversed()
    ofus1, prev_curs, more1 = q_reverse.fetch_page(num_items_page,
                                                 start_cursor=rev_cursor)

    context = {}

    if more and next_curs:
        context['next_curs'] = next_curs.urlsafe()

    if more1 and prev_curs:
        context['prev_curs'] = prev_curs.reversed().urlsafe()

問題、そしてこの質問のポイントは、私が使用moremore1て次のページがあるかどうかを確認することです。そして、それは逆の意味では機能していません。最初のページの場合more1True、、2番目のページのmore1場合はFalse、、後続のページの場合はTrue

False私は最初のページとTrue他のすべてのページに与える何かが必要になるでしょう。このmore戻り値を使用するようですが、クエリの設定が間違っているか、その他の問題がある可能性があります。

みんな、ありがとう!

編集:これに対する簡単な解決策が見つからなかったので、ndbpagerの使用に切り替えました。

4

2 に答える 2

2

そのようなことはありません。カーソルを使用してクエリを開始した場合、現在のページの前に (少なくとも) 1 ページあることがわかります (通常、最初のページにはカーソルがありません)。前のページにアクセスする一般的な方法は、並べ替え順序を逆にすることです。

作成日の降順で並べ替えられたリストがある場合、現在のページの最初の要素の作成日を取得し、逆の並べ替え順序を使用して作成日 < この作成日を持つ要素をクエリできます。これは、指定された作成日より新しい最も古い要素を返します。取得した要素のリストを反転すると (正しい順序に戻すため)、カーソルを使用せずに、以前のページの要素が表示されます。

:これには、並べ替え順の値が異なる必要があります。

場合によっては、さまざまなページへのランダム アクセスを可能にするビルド済みインデックスを使用することもできます

于 2012-12-20T09:52:47.970 に答える
-1

回避策がありますが、最善の解決策ではありません。それは基本的に前のページにリダイレクトしています。

<a href="javascript:history.back()">Previous</a>

PagedQuery には機能があると思いますが、誰かがより包括的なチュートリアルを投稿するのを待っています。

于 2014-08-21T19:59:47.867 に答える