def make_page_for_cbv(request, object_list, **kwargs): """Хелпер для быстрой генерации постранички Дефолтный рендер процессор и шаблон формирует ссылки безопасные для прочих get параметров Использование: - views.py: page = make_page(request, Item.objects.all(), count_per_page=2, page_get_parameter='item_page') - шаблон: <!-- список итемов --> - for item in page.object_list = item <!-- ссылки на постраничку --> = page.render Список возможных параметров - смотреть в коде в словаре default """ #значения по умолчанию default = { 'count_per_page': request.session.get('item_per_page', 10), #количество записей на страницу 'page_range': 3, #диапазон страниц 'page_get_parameter': 'page', #гет параметр отвечающий за значение текущей страницы 'render_processor': None, #рендер процессор (функция, которая рендерит шаблон постранички) 'template': 'utils/_paginator.html', #шаблон постранички } #инициализация параметров default.update(kwargs) paginator = Paginator(object_list, default['count_per_page']) try: page = int(request.GET.get(default['page_get_parameter'], '1')) except ValueError: page = 1 try: page = paginator.page(page) except (EmptyPage, InvalidPage): page = paginator.page(paginator.num_pages) def render_processor(request, page, **kwargs): """Процессор рендеринга, на случай необходимости расширения функционала постранички пишется отдельная функция для рендеринга (а то заебали, блеадь, в каждом проекте своя ебнутая постраничка и куда ни ткнись ни хуя не работает)""" return render_to_string( kwargs['template'], { 'request': request, 'page': page, 'page_range': (lambda d, s, e: d[s:e])(range(1, page.paginator.num_pages + 1), (lambda n: n >= 0 and n or 0)(page.number - 1 - kwargs['page_range']), page.number + kwargs['page_range']), 'page_get_parameter': kwargs['page_get_parameter'], 'count_per_page': request.session.get('item_per_page', 10) }) def renderer(): """Формируем замыкание на параметры конкретного пагинатора (необходимо для работы внешнего render_processor-а)""" return (callable(default['render_processor']) and default['render_processor'] or render_processor)(request, page, **default) #TODO: дописать возможность передачи рендерера по названию в виде 'app.package.module.calable_object' paginator.render = renderer return paginator
def make_page_for_cbv(request, object_list, **kwargs): """Хелпер для быстрой генерации постранички Дефолтный рендер процессор и шаблон формирует ссылки безопасные для прочих get параметров Использование: - views.py: page = make_page(request, Item.objects.all(), count_per_page=2, page_get_parameter='item_page') - шаблон: <!-- список итемов --> - for item in page.object_list = item <!-- ссылки на постраничку --> = page.render Список возможных параметров - смотреть в коде в словаре default """ # значения по умолчанию default = { 'count_per_page': request.session.get('item_per_page', 10), #количество записей на страницу 'page_range': 3, #диапазон страниц 'page_get_parameter': 'page', #гет параметр отвечающий за значение текущей страницы 'render_processor': None, #рендер процессор (функция, которая рендерит шаблон постранички) 'template': 'utils/_paginator.html', #шаблон постранички } #инициализация параметров default.update(kwargs) paginator = Paginator(object_list, default['count_per_page']) try: page = int(request.GET.get(default['page_get_parameter'], '1')) except ValueError: page = 1 try: page = paginator.page(page) except (EmptyPage, InvalidPage): page = paginator.page(paginator.num_pages) def render_processor(request, page, **kwargs): """Процессор рендеринга, на случай необходимости расширения функционала постранички пишется отдельная функция для рендеринга """ return render_to_string( kwargs['template'], { 'request': request, 'page': page, 'page_range': (lambda d, s, e: d[s:e])( range(1, page.paginator.num_pages + 1), (lambda n: n >= 0 and n or 0)(page.number - 1 - kwargs['page_range']), page.number + kwargs['page_range']), 'page_get_parameter': kwargs['page_get_parameter'], 'count_per_page': request.session.get('item_per_page', 10) }) def renderer(): """Формируем замыкание на параметры конкретного пагинатора (необходимо для работы внешнего render_processor-а)""" return (callable(default['render_processor']) and default['render_processor'] or render_processor)(request, page, **default) #TODO: дописать возможность передачи рендерера по названию в виде 'app.package.module.calable_object' paginator.render = renderer return paginator