1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
from django.core.paginator import EmptyPage, PageNotAnInteger
class RequestConfig:
"""
A configurator that uses request data to setup a table.
A single RequestConfig can be used for multiple tables in one view.
Arguments:
paginate (dict or bool): Indicates whether to paginate, and if so, what
default values to use. If the value evaluates to `False`, pagination
will be disabled. A `dict` can be used to specify default values for
the call to `~.tables.Table.paginate` (e.g. to define a default
`per_page` value).
A special *silent* item can be used to enable automatic handling of
pagination exceptions using the following logic:
- If `~django.core.paginator.PageNotAnInteger` is raised, show the first page.
- If `~django.core.paginator.EmptyPage` is raised, show the last page.
For example, to use `~.LazyPaginator`::
RequestConfig(paginate={"paginator_class": LazyPaginator}).configure(table)
"""
def __init__(self, request, paginate=True):
self.request = request
self.paginate = paginate
def configure(self, table):
"""
Configure a table using information from the request.
Arguments:
table (`~.Table`): table to be configured
"""
table.request = self.request
order_by = self.request.GET.getlist(table.prefixed_order_by_field)
if order_by:
table.order_by = order_by
if self.paginate:
if hasattr(self.paginate, "items"):
kwargs = dict(self.paginate)
else:
kwargs = {}
# extract some options from the request
for arg in ("page", "per_page"):
name = getattr(table, f"prefixed_{arg}_field")
try:
kwargs[arg] = int(self.request.GET[name])
except (ValueError, KeyError):
pass
silent = kwargs.pop("silent", True)
if not silent:
table.paginate(**kwargs)
else:
try:
table.paginate(**kwargs)
except PageNotAnInteger:
table.page = table.paginator.page(1)
except EmptyPage:
table.page = table.paginator.page(table.paginator.num_pages)
return table
|