Джанго - небольшое улучшение стандартного paginator

Джанго - небольшое улучшение стандартного paginator

Давно не пользовался paginator от Django, вот со свежим взглядом пришло две идеи, которые реально упрощают взаимодействие и фунционал дефолтного пажинатора.

Идея #1. В руководстве по pagination приведен кусок кода, который по идее должен всегда использоваться при формировании страницы. По моему этот код лишний и его стоит вынести в отдельную функцию, что я и сделал. В результате код превратился из:

 

def projects_list(request):
    projects = Project.objects.filter(is_public=True).order_by('-completed')
    paginator = Paginator(projects, 5) # Show 5 projects per page

    # Make sure page request is an int. If not, deliver first page.
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    # If page request (9999) is out of range, deliver last page of results.
    try:
        projects_page = paginator.page(page)
    except (EmptyPage, InvalidPage):
        projects_page = paginator.page(paginator.num_pages)


    return render_to_response('projects.html',
                              dict(page = projects_page,
                                   title = _('Recent projects')
                                   ))

в:

def projects_list(request):
    projects = Project.objects.filter(is_public=True).order_by('-completed')
    return render_to_response('projects.html',
                              dict(page = paginate_page(request, projects, 5),
                                   title = _('Recent projects')
                                   ))

Идея #2. Состоит в опциональном расширении функционала пажинатора с помощью технологии monkey-patching. Собственно говоря наш старый внутренний paginator писался с мыслью пофиксить одну проблему стандартного джанговского: добавить GET аргументы к страницам - эта задача возникает довольно часто.

Но, по моему мы поспешили и это решить можно намного проще. Сейчас, со стандартным django paginator, если есть необходимость добавить аргумент, мы его просто добавляем в page.args, и далее пользуемся немного улучшенным темплейтом paginator.html:

page.args='?'.join(actual_args_arr)

P.S. Template для paginator и функция доступны в общем доступе в наборе утилит для Django от Halogen D.G: DjHDGutils. Пользуйтесь на здоровье!