-
Каким способом на странице какого либо объекта сделать ссылки на предыдущий и последующий объекты? Индексы подтверждённых и опубликованных объектов не арифметическая последовательность. Для доступа к объектам используются запросы вида ^/post/\d/$
Paginator, я полагаю, для этих целей совсем не подходит, т.к. у него своя индексация.
-
Способов два:
Можно при формировании страницы вычислять значения id предыдущего и последующего объекта, и на странице сразу формировать правильные ссылки. Минусы: на каждую страницу два дополнительных запроса (хоть и очень быстрых), что создаст лишнюю нагрузку, если страницы объектов чаще вызываются из списка (или откуда-то ещё), чем по prev|next ссылкам. То есть, id запрашиваются даже тогда, когда они не нужны.
Можно на странице не глядя в базу формировать ссылки типа
^/post/\d/(prev|next)$. В виде, приписанном к таким урлам, вычислять из базы правильный id и делать редирект. Минусы: небольшая путаница с URL-ами, а также регулярные попадания на ошибку в начале и в конце списка объектов, так как заранее не известно, что объект последний или первый и к нему прицеплены ссылки, обещающие пользователю переход дальше.
Возможно есть и ещё способы, но я их не знаю (с удовольствием бы узнал).
Для этих способов могу даже привести код, если приведёте модель объекта и скажете, как собираетесь его упорядочивать.
Paginator - да, не подходит. Он для разбиения на страницы больших списков. Хотя то, что вы хотите тоже иногда называют "паджинация", но всё же это не то.
-
Каким способом на странице какого либо объекта сделать ссылки на предыдущий и последующий объекты? Индексы подтверждённых и опубликованных объектов не арифметическая последовательность. Для доступа к объектам используются запросы вида ^/post/\d/$
Предыдущий и следующий объект не имеют смысла если нет параметра ранжирования. Должна быть жестко задана последовательность. Это может быть алфавитный порядок по какому-нибудь полю, по дате публикации или даже по первичному ключу. Если нет формального параметра который диктуется логикой приложения, то его надо придумать максимально понятным для клиента.
Напрмер для получения такого рода объектов отсортированных по какой-то дате, существуют встроенные методы
get_next_by_FOO/get_previous_by_FOOДля остальных вариантов пишется аналогичный код.
Paginator, я полагаю, для этих целей совсем не подходит, т.к. у него своя индексация.
Почему не подходит? Страница из одного элемента - вполне вариант. Индексация у него пусть и своя (номер страниц), то вы, опять-таки задав жестко параметр сортировки, можете её использовать.
-
Напрмер для получения такого рода объектов отсортированных по какой-то дате, существуют встроенные методы get_next_by_FOO/get_previous_by_FOO
Спасибочки. Сейчас будем попробовать. Кажется то, что доктор прописал. -
А, так вам просто из базы prev|next таскать надо?.. Тогда всё просто. Помимо
get_next_by_FOO/get_previous_by_FOOесть и возможность получать объекты из таблицы, отсортированной не только по дате, но и по любому другому полю:your_object = YourModel.objects.get(id=the_id) next_id = YourModel.objects.filter(order_field__gt=your_object.order_field).order_by('order_field')[0].id prev_id = YourModel.objects.filter(order_field__lt=your_object.order_field).order_by('-order_field')[0].idА дальше уже подставляете эти id в ссылки удобным для вас способом.
-
Astur, спасибо за ответ с примерами. Кажется это тоже мой случай :)
-
Ошибочка в коде...
НЕ order_field__gt А order_field__gte
и
НЕ order_field__lt А order_field__lte
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

