В Django для реализации пагинации с возможностью настройки количества элементов на странице можно воспользоваться функциональностью класса Paginator
и его методами.
Первым шагом необходимо импортировать класс Paginator
из модуля django.core.paginator
:
from django.core.paginator import Paginator
Затем, в вашем представлении (view), где происходит отображение данных, нужно создать экземпляр класса Paginator
, который будет принимать два аргумента: объект QuerySet, который содержит данные, и количество элементов на каждой странице по умолчанию.
def my_view(request): items_per_page = 10 # Количество элементов на каждой странице по умолчанию queryset = MyModel.objects.all() # Ваш QuerySet paginator = Paginator(queryset, items_per_page)
Далее, пользователь должен иметь возможность выбрать количество элементов на странице. Для этого можно добавить форму или ссылки на страницы с разными значениями paginate_by
.
Когда пользователь выбирает количество элементов на странице, вы можете получить это значение из GET-параметра запроса и установить новое количество элементов на каждой странице с помощью метода per_page
экземпляра класса Paginator
:
def my_view(request): items_per_page = request.GET.get('paginate_by', 10) # Получает значение из GET-параметра с именем "paginate_by" queryset = MyModel.objects.all() # Ваш QuerySet paginator = Paginator(queryset, items_per_page) paginator.per_page = items_per_page # Установка нового значения items_per_page
Теперь, когда вы установили новое значение для per_page
, вы можете получить нужные элементы на странице с помощью метода get_page
экземпляра класса Paginator
и передать их в контекст при рендеринге шаблона:
def my_view(request): items_per_page = request.GET.get('paginate_by', 10) # Получает значение из GET-параметра с именем "paginate_by" queryset = MyModel.objects.all() # Ваш QuerySet paginator = Paginator(queryset, items_per_page) paginator.per_page = items_per_page # Установка нового значения items_per_page page_number = request.GET.get('page', 1) # Получает номер страницы из GET-параметра с именем "page" selected_page = paginator.get_page(page_number) # Передача данных в контекст при рендеринге шаблона context = { 'selected_page': selected_page, 'paginator': paginator, } return render(request, 'my_template.html', context)
В вашем шаблоне (template) вы можете использовать selected_page
для отображения данных выбранной страницы, а paginator
для отображения ссылок на другие страницы:
{% for item in selected_page %} {/* Отображение элементов на выбранной странице */} <!-- Ваш код --> {% endfor %} {/* Отображение ссылок на другие страницы */} <!-- Ваш код -->
Таким образом, вы создадите пагинацию, которая позволит пользователю самостоятельно регулировать количество элементов на странице и отображать соответствующие данные.