I have read the manual recipe on pagination: http://web2py.com/books/default/chapter/29/14/other-recipes#Pagination
That works fine if we just want to have a page aware if it has a previous or next one, but what if we want also to get the list of all next pages? i.e. by putting a link for each next page, near the next "button"? Let's say I have 300 records in a table, I want to serve 10 per time. If I am serving page 1, there are other 29 pages more, so I want to be able to put links at least to page 2, 3, 4, 5, 6.... so to make navigation easier. The recipe in the manual is quite good, because it allows to get only the 10 elements I need to serve in the current page, but my page do not know how many pages there are in total. I was thinking to solve this creating a PageThread class taking care of storing the information about the whole. My idea was to let this class making the query for all items in the table and then creating the single pages to serve. But the problem here is that when the controller will instantiate this class it will reset it all times, so it will make the query to the whole table every time, so it's wasted. Probably this can be solved using the web2py built-in count() or is there a possibility to use cache? Does anybody already solved this problem somewhere? This is a sample of the code of the two classes I thought about: class PageThread(object): def __init__(self, items, items_per_page=10): self.items = items self.items_count = len(self.items) self.items_per_page = items_per_page self.__set_number_of_pages() self.__load_pages() def __set_number_of_pages(self): self.number_of_pages = self.items_count/self.items_per_page + 1 if self.items_count % self.items_per_page else self.items_count/self. items_per_page def __load_pages(self): self.pages = [Page(p_id, self.items[(p_id-1)*self.items_per_page: p_id*self.items_per_page]) for p_id in range(1, self.number_of_pages+1)] class Page(object): def __init__(self, id, items): # id is the unique number of the page in the PageThread self.id = id self.items = items def __str__(self): return 'Page n.{}, {} items: {}'.format(self.id, len(self.items), self.items) While this was the original Page that just knows if it has previous or next: class Page(object): def __init__(self, page, items_per_page=10): self.id = int(page) self.items_per_page = items_per_page # range gives you an item more in order to check if there is a next page self.range = ((self.id-1)*self.items_per_page, self.id*self. items_per_page+1) def load_items(self, rows): # where rows are those returned from a select query to the db if len(rows) > self.items_per_page : self.has_next = True self.items = rows[:-1] else: self.has_next = False self.items = rows def get_page_navigation_div(self, **request_vars): contents = [] request_vars.update({'items_per_page': self.n_items}) if self.has_previous: request_vars.update({'page': self.id-1}) contents.append( A('<<< previous', _class='nav-previous', _href= URL(vars=request_vars)) ) for n in range(1, self.id): request_vars.update({'page': n}) contents.append( A(' %s' % n, _class='nav-page', _href=URL(vars= request_vars)) ) if self.has_next: request_vars.update({'page': self.id+1}) contents.append( A('next >>>', _class='nav-next', _href=URL(vars =request_vars)) ) return DIV(*contents, _id='page_navigation') In the controller you use like this: page = Page(request.vars.page, 10) page.load_items(db(your_query).select(limitby=page.range)) #do stuff return dict(page=page) -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.