Blog Entry: Джанго - небольшое улучшение стандартного 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. Пользуйтесь на здоровье!
