如何使用ndb游标翻转到上一页?

Hou*_*man 7 paging google-app-engine cursor app-engine-ndb

我无法在ndb分页中找到"上一页".

我已经检查了文档以及这个类似的问题但没有成功.

 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)
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

我可以正确翻页直到结束.但是我不能向后翻页直到最后一页,即便如此,我也无法翻页直到第一页.

我错过了什么?

更新:

使用费萨尔的建议更改了代码.我必须承认,它的效果更好.但是分页仍然无法正常工作:

我有7个条目.配置中的PAGE_SIZE为3.因此我们得到三页:

当点击Next我得到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)
Run Code Online (Sandbox Code Playgroud)

更新2:

现在看起来它几乎与reverse()一起工作.

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

1 - >上一页 - > 2,3,4 - > 5,6,7(订单不是最新的最新日期)

Fai*_*sal 9

所以我在这里做的是使用当前书签来导航下一个或上一个,并删除其他查询,这样它就不会为每个请求查询两次.(当我测试它时,编辑旧的描述/答案是错误的.这个在我的本地主机上工作).

尝试:

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
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)