如何使用 ndb 光标翻到上一页? [英] How to flip to previous page with ndb cursors?
问题描述
我无法在 ndb 分页中进入上一页".
I cant manage to get to 'previous page' in ndb paging.
I have checked the documentation and also this similar question here without success.
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 %}
我可以正确地向前翻页直到最后.但是我不能向后翻页直到最后一页,即使那样我也不能向后翻页直到第一页.
I can page forwards correctly until the end. But I can't page backwards until the last page and even then I can't page back until the first page neither.
请问我遗漏了什么?
更新:
根据 Faisal 的建议更改了代码.我必须承认它效果更好.但分页仍然无法正常工作:
Changed code with Faisal's suggestions. It works better I must admit. But still the paging doesn't work correctly:
我有 7 个条目.配置中的 PAGE_SIZE 为 3.因此我们得到三个页面:
I have 7 entries. PAGE_SIZE in config is 3. Hence we get three pages:
当点击下一步时,我得到 7,6,5 -> 4,3,2 -> 1 Perfect.现在点击上一个:1 -> 3,4,5 (?) -> 5,6,7 (?)
When clicking on Next I get 7,6,5 -> 4,3,2 -> 1 Perfect. Now when clicking on previous: 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)
更新 2:
现在看来它几乎可以使用 reverse() 了.
It seems now its nearly working with reverse().
7,6,5 -> 下一个 -> 4,3,2 -> 下一个 -> 1
7,6,5 -> next -> 4,3,2 -> next -> 1
1 -> prev -> 2,3,4 -> 5,6,7(订单不再是最新日期第一)
1 -> prev -> 2,3,4 -> 5,6,7 (Order is no longr latest date first)
推荐答案
所以我在这里做的是使用当前书签来导航下一个或上一个并删除另一个查询,这样它就不会为每个请求查询两次.(在我测试时编辑了旧的描述/答案是错误的.这个在我的本地主机上工作).
So what I do here is use the current bookmark to for navigating for next or previous and removed the other query so it doesn't query twice for each request. (Edited the old description/answer was wrong when I tested it. This one works on my localhost).
试试:
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 %}
这篇关于如何使用 ndb 光标翻到上一页?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!