Example #1
0
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
Example #2
0
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