Skip to content

Commit 35c28a2

Browse files
committed
Include correct limits in LimitOffsetPagination link urls
1 parent 8935db1 commit 35c28a2

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

rest_framework/pagination.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ def get_next_link(self):
431431
return None
432432

433433
url = self.request.build_absolute_uri()
434+
url = replace_query_param(url, self.limit_query_param, self.limit)
435+
434436
offset = self.offset + self.limit
435437
return replace_query_param(url, self.offset_query_param, offset)
436438

@@ -439,6 +441,7 @@ def get_previous_link(self):
439441
return None
440442

441443
url = self.request.build_absolute_uri()
444+
url = replace_query_param(url, self.limit_query_param, self.limit)
442445

443446
if self.offset - self.limit <= 0:
444447
return remove_query_param(url, self.offset_query_param)

tests/test_pagination.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ class TestLimitOffset:
287287
def setup(self):
288288
class ExamplePagination(pagination.LimitOffsetPagination):
289289
default_limit = 10
290+
max_limit = 15
291+
290292
self.pagination = ExamplePagination()
291293
self.queryset = range(1, 101)
292294

@@ -442,7 +444,31 @@ def test_invalid_limit(self):
442444
"""
443445
request = Request(factory.get('/', {'limit': 'invalid', 'offset': 0}))
444446
queryset = self.paginate_queryset(request)
447+
content = self.get_paginated_content(queryset)
448+
next_limit = self.pagination.default_limit
449+
next_offset = self.pagination.default_limit
450+
next_url = 'http://testserver/?limit={0}&offset={1}'.format(next_limit, next_offset)
445451
assert queryset == [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
452+
assert content.get('next') == next_url
453+
454+
def test_max_limit(self):
455+
"""
456+
The limit defaults to the max_limit when there is a max_limit and the
457+
requested limit is greater than the max_limit
458+
"""
459+
offset = 50
460+
request = Request(factory.get('/', {'limit': '11235', 'offset': offset}))
461+
queryset = self.paginate_queryset(request)
462+
content = self.get_paginated_content(queryset)
463+
max_limit = self.pagination.max_limit
464+
next_offset = offset + max_limit
465+
prev_offset = offset - max_limit
466+
base_url = 'http://testserver/?limit={0}'.format(max_limit)
467+
next_url = base_url + '&offset={0}'.format(next_offset)
468+
prev_url = base_url + '&offset={0}'.format(prev_offset)
469+
assert queryset == list(range(51, 66))
470+
assert content.get('next') == next_url
471+
assert content.get('previous') == prev_url
446472

447473

448474
class TestCursorPagination:

0 commit comments

Comments
 (0)