Usually you have some means to "order" the records (e.g., a "id" field that
is 1,2,3,4,5, a "name" field that is a,b,c,d, an inserted_on datetime
field that is 2012-07-23m, 2012-07-24, etc etc etc).
When the order of the records is established in a list:
all_records = ['a','b','c','d',.......]
you can (this is python, not strictly web2py)
>>> all_records[0]
'a'
>>> all_records[-1]
'd'
>>> all_records[2:4]
['c', 'd']
NB: list indexes are 0 indexed (the first record is [0], not [1])
So, back to your example, you'd need on the first page to show records from
0 to 9, on the second page records from 10 to 19, and so on.
Given that in web2py you can catch (with the previous example) the
/myapp/mycontroller/myfunction/*thenumberofthepage* with request.args(0),
still refreshing some math you need to "associate" the number of pages to
the range you want. This is what you need to calculate:
page 1 : all_records[0:10]
page 2: all_records[10:20]
page 3: all_records[20:30]
and so on.
page_number = request.args(0)
records_per_page = 10
records_to_show = all_records[(page_number-1)*records_per_page:page_number*
records_per_page]
and that's pretty much about it. There are smarter way, different
implementations, etc etc but this is the straightforward way to show a
"universal" method based on a simple calculation.
NB:
all_records = ['a','b']
all_records[10:20]
>>> []
no exceptions are thrown. If you get an empty list you are "requesting a
too far page", i.e. a page with a too high *thenumberofthepage*
On Monday, July 23, 2012 10:38:01 PM UTC+2, adohertyd wrote:
>
> Thank you for that makes perfect sense. This might be a stupid question
> but do I need to create an individual HTML page for each result set? The
> whole pagination thing is a mystery to me!
>
> On Monday, 23 July 2012 21:33:34 UTC+1, Niphlod wrote:
>>
>> That's math!
>> e.g.
>> records_per_page = 10 records
>> all_records = 137 records
>>
>> pages_needed = all_records / records_per_page (division)
>> last_page = all_records % records_per_page (module)
>>
>> that is 13 "full pages" + 1 page with 7 records.
>>
>> So, you'll have to count the total of your records, divide it by the
>> number of "records per page" , an voila.
>>
>> If you want urls in the form of (/myapp/mycontroller/myfunction/1,
>> /myapp/mycontroller/myfunction/2, /myapp/mycontroller/myfunction/3, etc) it
>> would roughly translate to:
>>
>> all_records = 137
>> records_per_page = 10
>> urls = [URL('myapp', 'mycontroller', 'myfunction', args=[page+1]) forpage
>> in range(all_records+1)]
>>
>>
>>
>> On Monday, July 23, 2012 10:20:48 PM UTC+2, adohertyd wrote:
>>>
>>> I have an application that returns a list of between 50-100 items. I
>>> have no database layer it isn't required for my app. I want to display 10
>>> of those items on a page, and only generate the number of pages needed to
>>> view those results. Can anyone point me in the right direction (not the
>>> docs, they don't make any sense to me for this problem). Thank you
>>
>>
--