我无法在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 %}
我可以正确翻页直到结束。 但是在最后一页之前我无法向后翻页,即便如此,我也无法翻页直到第一页。
我错过了什么?
更新
使用费萨尔的建议更改了代码。我必须承认,它的效果更好。但是分页仍然无法正常工作:
我有7个条目。配置中的PAGE_SIZE为3.因此我们得到三页:
点击下一步我得到7,6,5 - &gt; 4,3,2 - &gt; 1完美。 现在点击上一个:1 - &gt; 3,4,5(?) - &gt; 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()一起工作。
7,6,5 - &gt;下一个 - &gt; 4,3,2 - &gt;下一个 - &gt; 1
1 - &gt; prev - &gt; 2,3,4 - &gt; 5,6,7(订单不是最新的最新日期)
答案 0 :(得分: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
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 %}
答案 1 :(得分: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