Делим на страницы
admin |
Практически в любом сайте есть нужда разбить вывод информации на страницы. В джанге уже есть некоторые вещи которые помогут в написании своего пагинатора, но вот что бы взять и в две строчки сделать пагинацию для любой вьюшки — такого пока не встречал.
Я решил написать такой, благо идея как его сделать у меня зародилась уже давно. Итак встречаем, django-simplepagination.
Пагинатор по сути является декоратором, который вы ставите над вашей вьюшкой с одним условием. Условие очень простое, вьюшка должна возвращать словарь, а не HttpResponse. Если вы используйте самописный декоратор render_to или пользуетесь таковым из django-annoying то все условия для разбития на страницы соблюдены. Дальше всё очень просто, инсталируете django-simplepagination, добавляете 'simplepagination' в INSTALLED_APPS и ставите декоратор над вьюшкой. Для примера:
Далее в темплейте 'blog_posts.html' вы вставляете {% include paginator.template %}, так же не забудьте в базовом шаблоне подключить paginator.css файл.
На этом создание копии digg пагинации заканчивается.
Естественный вопрос, как происходит что из трёх строчек кода, очень сложный по логике и виду дигг'овский пагинатор работает? Объясню, логика пагинаторов описывается в так называемых backend'ах. Бэкенд digg'а уже встроен в приложение, он так же является примером для тех кто хочет написать свой бэкенд. Кроме логики нужен конечно же и html, он тоже встроен в приложение, как и css со стилями для digg пагинатора.
Конечно вряд ли ваш сайт использует именно digg версию пагинатора, поэтому я покажу вам как написать свой бэкенд, для примера возьмём пагинацию хабрахабра.
Итак первым делом вам нужно создать класс наследующийся от simplepagination.backends.Paginator. Сама логика лежит внутри функции paginate которая обязана быть в вашем классе.
После того как бэкенд срабатывает, в словарь который возвращает вьюшка добавляется этот output под именем 'paginator' и соответственно попадает в ваш темплейт.
Теперь дело за малым, выдрать хтмл и css из хабра (я сделал это за вас, заодно префикснул имена классов что бы они не совпали с теми которые могут уже быть на вашем сайте), сохранить хтмл под именем paginator_habrahabr.html и подключить сохранёный цсс.
Последняя вещь которую нужно сделать, это добавить ваш бэкенд в словарь бэкендов. Откройте settings.py вашего сайта и добавьте следующую строчку (измените путь до вашего класса на нужный).
PAGINATION_BACKENDS = {'habrahabr': 'path.to.HabrahabrPaginator'}
На этом возможности приложения не заканчиваются, можно использовать несколько стилей пагинации на одном сайте, у всех вещей есть дефолтные настройки, которые можно изменить как общими настройками определённого бэкенда так и параметрами передаваемыми в декоратор. Советую глянуть на файл settings.py и почитать описания настроек.
Я решил написать такой, благо идея как его сделать у меня зародилась уже давно. Итак встречаем, django-simplepagination.
Пагинатор по сути является декоратором, который вы ставите над вашей вьюшкой с одним условием. Условие очень простое, вьюшка должна возвращать словарь, а не HttpResponse. Если вы используйте самописный декоратор render_to или пользуетесь таковым из django-annoying то все условия для разбития на страницы соблюдены. Дальше всё очень просто, инсталируете django-simplepagination, добавляете 'simplepagination' в INSTALLED_APPS и ставите декоратор над вьюшкой. Для примера:
Далее в темплейте 'blog_posts.html' вы вставляете {% include paginator.template %}, так же не забудьте в базовом шаблоне подключить paginator.css файл.
На этом создание копии digg пагинации заканчивается.
Естественный вопрос, как происходит что из трёх строчек кода, очень сложный по логике и виду дигг'овский пагинатор работает? Объясню, логика пагинаторов описывается в так называемых backend'ах. Бэкенд digg'а уже встроен в приложение, он так же является примером для тех кто хочет написать свой бэкенд. Кроме логики нужен конечно же и html, он тоже встроен в приложение, как и css со стилями для digg пагинатора.
Конечно вряд ли ваш сайт использует именно digg версию пагинатора, поэтому я покажу вам как написать свой бэкенд, для примера возьмём пагинацию хабрахабра.
Итак первым делом вам нужно создать класс наследующийся от simplepagination.backends.Paginator. Сама логика лежит внутри функции paginate которая обязана быть в вашем классе.
После того как бэкенд срабатывает, в словарь который возвращает вьюшка добавляется этот output под именем 'paginator' и соответственно попадает в ваш темплейт.
Теперь дело за малым, выдрать хтмл и css из хабра (я сделал это за вас, заодно префикснул имена классов что бы они не совпали с теми которые могут уже быть на вашем сайте), сохранить хтмл под именем paginator_habrahabr.html и подключить сохранёный цсс.
Последняя вещь которую нужно сделать, это добавить ваш бэкенд в словарь бэкендов. Откройте settings.py вашего сайта и добавьте следующую строчку (измените путь до вашего класса на нужный).
PAGINATION_BACKENDS = {'habrahabr': 'path.to.HabrahabrPaginator'}
На этом возможности приложения не заканчиваются, можно использовать несколько стилей пагинации на одном сайте, у всех вещей есть дефолтные настройки, которые можно изменить как общими настройками определённого бэкенда так и параметрами передаваемыми в декоратор. Советую глянуть на файл settings.py и почитать описания настроек.