2013-07-31 24 views
7

Nie mogę dostać się do "poprzedniej strony" w stronicowaniu ndb.Jak przejść do poprzedniej strony za pomocą kursorów ndb?

Sprawdziłem documentation, a także ten podobny question here bez powodzenia.

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

Mogę strona w przód do końca poprawnie. Ale nie mogę przejść wstecz, aż do ostatniej strony, a nawet wtedy nie będę mógł oddzwonić aż do pierwszej strony.

Czego mi brakuje?

UPDATE:

Zmieniono kod z sugestiami Faisala. Działa lepiej, muszę przyznać. Ale nadal stronicowanie nie działa poprawnie:

Mam 7 wpisów. PAGE_SIZE w config to 3. Stąd otrzymujemy trzy strony:

Po kliknięciu Dalej otrzymuję 7,6,5 -> 4,3,2 -> 1 Perfect. Teraz po kliknięciu na poprzednie: 1 -> 3,4,5 -> 5,6,7

Dzięki za pomoc

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 (?):

(?)

Wygląda na to, że prawie działa z odwróceniem().

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

1 -> wstecz -> 2,3,4 -> 5,6,7 (Zamówienie jest no longr data najnowsza jako pierwsza)

+0

Dostałeś problem zamawianie zorientowali się? Robię również porządek daty i wzorzec w tym bałaganie. –

Odpowiedz

9

W tym celu używam bieżącej zakładki, aby przejść do następnej lub poprzedniej, i usunięto drugie zapytanie, aby nie dwa razy pytać o każde żądanie. (Poddałem edycji stary opis/odpowiedź była błędna, gdy testowałem to działa na moim localhost).

Spróbuj:

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

Faisal, dziękuję bardzo za pomoc w tej sprawie.Wysłałem teraz zaktualizowany kod i wynik. Działa lepiej niż wcześniej, jednak poprzednie kroki wciąż nie są poprawne. Tak dziwne ... – Houman

+0

zaktualizowałem odpowiedź, dodałem cursor.reversed(), gdy is_prev Myślę, że to właśnie przegapiłem. – Faisal

+0

Tak Faisal, że prawie całkowicie rozwiązał problem. Nieco skomplikowane. Ale kolejność nadal nie jest w pełni poprawna. Zobacz zaktualizowane pytanie. Dziękujemy – Houman

0

Tutaj masz kompletne rozwiązanie do pracy. Coś jest nie tak w twoim kodzie.

Najważniejsze jest odwrócenie wyników podczas cofania. To trudne.

Tutaj masz:

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 

To jest link do projektu github: https://github.com/janscas/ndb-gae-pagination

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. –

+0

Zmieniono, więc wyświetlany jest aktualny kod. – janscas