Skip to content

Commit 34f42d9

Browse files
committed
Update pagination to better handle parameters with POST
1 parent 510f749 commit 34f42d9

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

rest_framework_datatables/pagination.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,22 +43,37 @@ def get_count_and_total_count(self, queryset, view):
4343

4444

4545
class DatatablesPageNumberPagination(DatatablesMixin, PageNumberPagination):
46+
page_query_param = 'start'
47+
page_size_query_param = 'length'
48+
49+
def get_page_size(self, request):
50+
if self.page_size_query_param:
51+
try:
52+
size = int(get_param(request, self.page_size_query_param))
53+
if size <= 0:
54+
raise ValueError()
55+
if self.max_page_size:
56+
return min(size, self.max_page_size)
57+
return size
58+
except ValueError:
59+
pass
60+
return self.page_size
61+
4662
def paginate_queryset(self, queryset, request, view=None):
4763
if request.accepted_renderer.format != 'datatables':
4864
self.is_datatable_request = False
4965
return super(
5066
DatatablesPageNumberPagination, self
5167
).paginate_queryset(queryset, request, view)
5268

53-
length = get_param(request, 'length')
69+
length = get_param(request, self.page_size_query_param)
5470

5571
if length is None or length == '-1':
5672
return None
5773
self.count, self.total_count = self.get_count_and_total_count(
5874
queryset, view
5975
)
6076
self.is_datatable_request = True
61-
self.page_size_query_param = 'length'
6277
page_size = self.get_page_size(request)
6378
if not page_size: # pragma: no cover
6479
return None
@@ -73,7 +88,7 @@ def count(self):
7388
return self.value
7489

7590
paginator = CachedCountPaginator(self.count, queryset, page_size)
76-
start = int(get_param(request, 'start', 0))
91+
start = int(get_param(request, self.page_query_param, 0))
7792
page_number = int(start / page_size) + 1
7893

7994
try:
@@ -88,6 +103,9 @@ def count(self):
88103

89104

90105
class DatatablesLimitOffsetPagination(DatatablesMixin, LimitOffsetPagination):
106+
limit_query_param = 'length'
107+
offset_query_param = 'start'
108+
91109
def get_limit(self, request):
92110
try:
93111
limit_value = int(get_param(request, self.limit_query_param))
@@ -113,10 +131,8 @@ def get_offset(self, request):
113131
def paginate_queryset(self, queryset, request, view=None):
114132
if request.accepted_renderer.format == 'datatables':
115133
self.is_datatable_request = True
116-
if get_param(request, 'length') is None:
134+
if get_param(request, self.limit_query_param) is None:
117135
return None
118-
self.limit_query_param = 'length'
119-
self.offset_query_param = 'start'
120136
self.count, self.total_count = self.get_count_and_total_count(
121137
queryset, view
122138
)

0 commit comments

Comments
 (0)