[noob, web, django] отображать контент порциями

Alena_08_11

преамбула : Решил немного поосваивать технологии сайтостроительства на примере django (никогда раньше ничем подобным не занимался, в программировании почти ноль полный).
Наверное с этим вопросом сталкивается каждый, после пары дней изучения своей первой web технологии.
Как отображать контент порциями по n штук на странице с кнопками next и previous ? В каких то простых случаях можно извратится, зашив в урлы для линков на previous и next значение id или другого пограничного поля, которое затем можно передать в функцию представления и на их основе генерировать конкретный запрос с условием. Но что делать для результата произвольного запроса ? (Конечно есть вариант в лоб, выполнить опять запрос целиком и отобразить записи с k + 1 по k + n, но это как то хреновато)
ps. Так как нечто подобное используется чуть менее чем на всех сайтах, то явно существует методика и она где то хорошо описана. Ткните плз ссылкой или объясните в двух словах суть методики вообще, и есть ли какие нить заготовки для этого в django в частности.

Alena_08_11

Хмм
как только написал post - сразу откуда то в голове взялся термин "Постраничная навигация", на что гугл дал такую ссылку : http://www.egoholic.ru/2010/04/hacker-news.html
Попробую пока раскурить это.
upd: По ходу это только для google app store
ps. Все ещё хочу ссылки на полезную информацию по данной теме.

rosali

> простых случаях можно извратится, зашив в урлы для линков на previous и next значение id
> есть вариант в лоб, выполнить опять запрос целиком и отобразить записи с k + 1 по k + n, но это как то хреновато
между двумя запросами к вебсерверу нельзя передать контекст. поэтому что бы тебе тут не посоветовали, в любом случае это будут вариации одного из этих двух способов. возможно скрытые за каким-то удобным синтаксисом, но суть от этого не изменится. так что в итоге тебе придется таки сделать выбор между "извратиться" и "хреновато" =)

Dasar

что бы тебе тут не посоветовали, в любом случае это будут вариации одного из этих двух способов
есть еще третий способ: вырезка записей страницы делается на стороне сервера(базы)

Alena_08_11

есть еще третий способ: вырезка записей страницы делается на стороне сервера
Непонятна мысль.

Dasar

Непонятна мысль.
если мы бьем на страницы по 20 записей, то, например, для показа страницы n, нужно выбрать
записи с n*20 по n * 20 + 20
такую вырезку можно делать на клиенте (сначала выбрав все записи, а потом вырезав нужные а можно делать на стороне сервера(базы например. через такой запрос или аналог

select top 20 * from tovar
where id in (select top (n*20+20) id from tovar order by id)
order by id desc

Alena_08_11


select top 20 * from tovar where ... and id not in (select top (n*20) id from tovar where ... order by id) order by id desc

Наверное так ближе ?
Хмм, в mysql вообще оказывается можно

select * from tovar where ... order by id limit n*20, 20

но в django собственный orm, и напрямую там sql запросами не побросаешься. Хотя мне тут накидали ссылок на какой то paginator, пойду покурю их (мб это и есть нужная обвязка)
UPD: мде. Ларчик то совсем просто открывается в django. Запрос вида

tovars = Tovar.objects.filter(...)[n*20:n*20+20]

Как раз выполняет тот самый sql запрос c limit. При этом выполняется быстро ( по субъективным ощущениям) и возвращает то что нужно.
Всем спасибо.

pilot

есть еще третий способ: вырезка записей страницы делается на стороне сервера(базы)
Это чем же он третий? :smirk:

rosali

> вырезка записей страницы делается на стороне сервера(базы)
ну это как раз первый.
а настоящий третий - написать полностью листание на яваскрипте =)
теоретически еще есть способ 2' когда результат запроса сохраняется в какой-нибудь memchached, и для второй страницы уже берется оттуда. но по-моему нафик с этим не нужно заморачиваться, если уж первую страницу согласны подождать, то и вторую тоже подождут ;)

Dasar

а настоящий третий - написать полностью листание на яваскрипте =)
вывод страницы: через статические закладки, через ajax, через виртуальный скролл - ортогонален к способу получения записей для страницы.

Dasar

Это чем же он третий?
если сможешь сформулировать особенности первых двух способов, то поймешь и третий...
Оставить комментарий
Имя или ник:
Комментарий: