2013-07-31 17 views
7

ndbのページングで「前のページ」にアクセスできません。ndbカーソルで前のページに移動するにはどうすればいいですか?

私はdocumentationと同様にこのようなquestion hereを確認しています。

def show_feedback(kind, bookmark=None): 
    """Renders returned feedback.""" 
    cursor = None  
    more_p= None 
    if bookmark: 
     cursor = Cursor(urlsafe=bookmark) 

    q = Feedback.query() 
    q_forward = q.filter(Feedback.kind==Feedback.KINDS[kind]).order(-Feedback.pub_date) 
    q_reverse = q.filter(Feedback.kind==Feedback.KINDS[kind]).order(Feedback.pub_date) 

    feedbacks, next_cursor, more = q_forward.fetch_page(app.config['FEEDBACK_PER_PAGE'], start_cursor=cursor) 
    if cursor: 
     rev_cursor = cursor.reversed() 
     feedbacks2, prev_cursor, more_p = q_reverse.fetch_page(app.config['FEEDBACK_PER_PAGE'], start_cursor=rev_cursor) 

    next_bookmark = None 
    prev_bookmark = None 
    if more and next_cursor: 
     next_bookmark = next_cursor.urlsafe() 
    if more_p and prev_cursor: 
     prev_bookmark = prev_cursor.urlsafe() 
    return render_template_f11('show_feedback.html', kind=kind, feedbacks=feedbacks, next_bookmark=next_bookmark, prev_bookmark=prev_bookmark) 

HTML:

{% if prev_bookmark %} 
     <a href="{{ url_for(request.endpoint, bookmark=prev_bookmark) }}">Previous</a> 
    {% endif %} 
    {% if next_bookmark %} 
    <a href="{{ url_for(request.endpoint, bookmark=next_bookmark) }}">Next</a> 
    {% endif %} 

私は、ページが最後まで正しく転送することができます。 しかし、私は最後のページまで逆方向にページすることはできませんし、最初のページまでページを戻すこともできません。

どうしたらいいですか?

UPDATE:ファイサルの提案を

変更コード。それは私が認めなければならないよりうまく動作します。しかし、まだページングが正しく動作しません:

私は7つのエントリがあります。 config内のPAGE_SIZEは3です。したがって、3ページを取得します。

次をクリックすると、7,6,5 - > 4,3,2 - > 1 Perfectを取得します。 今、前をクリックしたとき:1 - > 3,4,5 - > 5,6,7あなたの助けを

おかげ

def show_feedback(kind, bookmark=None): 
    """Renders returned feedback.""" 
    is_prev = request.args.get('prev', False) 
    cursor = None   
    if bookmark: 
     cursor = Cursor(urlsafe=bookmark) 

    q = Feedback.query() 
    q_forward = q.filter(Feedback.kind==Feedback.KINDS[kind]).order(-Feedback.pub_date) 
    q_reverse = q.filter(Feedback.kind==Feedback.KINDS[kind]).order(Feedback.pub_date) 

    qry = q_reverse if is_prev else q_forward 

    feedbacks, cursor, more = qry.fetch_page(app.config['FEEDBACK_PER_PAGE'], start_cursor=cursor) 

    if is_prev: 
     prev_bookmark = cursor.reversed().urlsafe() if more else None 
     next_bookmark = bookmark 
    else: 
     prev_bookmark = bookmark 
     next_bookmark = cursor.urlsafe() if more else None 
    return render_template_f11('show_feedback.html', kind=kind, feedbacks=feedbacks, next_bookmark=next_bookmark, prev_bookmark=prev_bookmark) 

UPDATE 2(?):

(?)

これはreverse()でほぼ動作しているようです。

7,6,5 - >次 - > 4,3,2 - >次 - > 1

1 - >前 - > [2,3,4] - > [5,6,7(順序は

+0

あなたが発注の問題が考え出しましたか私はまた日付の順序をしているし、ドキュメントのパターンを混乱させる。 –

答えて

9

ここで私がやっているのは、現在のブックマークを使ってnextまたはpreviousをナビゲートし、他のクエリを削除して各リクエストごとに2回クエリしないようにすることです。 (私はそれをテストしたときに古い記述/答えを編集しました。これは私のローカルホスト上で動作します)。

試してみてください。

is_prev = self.request.get('prev', False) 
if is_prev: 
    qry = q_reverse 
    cursor = cursor.reversed() 
else: 
    qry = q_forward 

feedbacks, cursor, more = qry.fetch_page(app.config['FEEDBACK_PER_PAGE'], start_cursor=cursor) 

if is_prev: 
    prev_bookmark = cursor.reversed().urlsafe() if more else None 
    next_bookmark = bookmark 
else: 
    prev_bookmark = bookmark 
    next_bookmark = cursor.urlsafe() if more else None 

HTMLここ

{% if prev_bookmark %} 
    <a href="{{ url_for(request.endpoint, bookmark=prev_bookmark, prev=True) }}">Previous</a> 
{% endif %} 
{% if next_bookmark %} 
    <a href="{{ url_for(request.endpoint, bookmark=next_bookmark) }}">Next</a> 
{% endif %} 
+0

ファイサル、これにあなたの助けをありがとうございました。私は今、更新されたコードと結果を掲載しました。以前の手順はまだ正しくはありませんが、これまでよりもうまく動作します。だから奇妙な... – Houman

+0

答えを更新、私はcursor.reversed()を追加したときis_prev私はそれが私が逃したと思う。 – Faisal

+0

はいファイサル、問題をほぼ完全に解決しました。かなり複雑です。しかし、注文はまだ完全には正しくありません。更新された質問をご覧ください。 – Houman

0

あなたは、完全な実用的なソリューションを持っています。あなたのコードに何か問題があります。

重要なことは、後ろに行くときの結果を逆にすることです。それはトリッキーです。ここで

あなたが持っている:

def return_query_page(query_class, size=10, bookmark=None, is_prev=None, equality_filters=None, orders=None): 
    """ 
    Generate a paginated result on any class 
    Param query_class: The ndb model class to query 
    Param size: The size of the results 
    Param bokkmark: The urlsafe cursor of the previous queries. First time will be None 
    Param is_prev: If your requesting for a next result or the previous ones 
    Param equal_filters: a dictionary of {'property': value} to apply equality filters only 
    Param orders: a dictionary of {'property': '-' or ''} to order the results like .order(cls.property) 
    Return: a tuple (list of results, Previous cursor bookmark, Next cursor bookmark) 
    """ 
    if bookmark: 
     cursor = ndb.Cursor(urlsafe=bookmark) 
    else: 
     is_prev = None 
     cursor = None 

    q = query_class.query() 
    try: 
     for prop, value in equality_filters.iteritems(): 
      q = q.filter(getattr(query_class, prop) == value) 

     q_forward = q.filter() 
     q_reverse = q.filter() 

     for prop, value in orders.iteritems(): 
      if value == '-': 
       q_forward = q_forward.order(-getattr(query_class, prop)) 
       q_reverse = q_reverse.order(getattr(query_class, prop)) 
      else: 
       q_forward = q_forward.order(getattr(query_class, prop)) 
       q_reverse = q_reverse.order(-getattr(query_class, prop)) 
    except: 
     return None, None, None 
    if is_prev: 
     qry = q_reverse 
     new_cursor = cursor.reversed() if cursor else None 
    else: 
     qry = q_forward 
     new_cursor = cursor if cursor else None 

    results, new_cursor, more = qry.fetch_page(size, start_cursor=new_cursor) 
    if more and new_cursor: 
     more = True 
    else: 
     more = False 

    if is_prev: 
     prev_bookmark = new_cursor.reversed().urlsafe() if more else None 
     next_bookmark = bookmark 
     results.reverse() 
    else: 
     prev_bookmark = bookmark 
     next_bookmark = new_cursor.urlsafe() if more else None 

    return results, prev_bookmark, next_bookmark 

これはgithubのプロジェクトへのリンクです:https://github.com/janscas/ndb-gae-pagination

+1

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 –

+0

現在のコードが表示されるように変更されました。 – janscas

関連する問題