Как сделать так, чтобы пользователь мог сам регулировать сколько элементов на странице будет изображено (paginate_by=число выбранное пользователем)?

В 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 %}

{/* Отображение ссылок на другие страницы */}
<!-- Ваш код -->

Таким образом, вы создадите пагинацию, которая позволит пользователю самостоятельно регулировать количество элементов на странице и отображать соответствующие данные.