Я думаю, способ, которым вы описываете это, будет работать нормально, потому что за кулисами я полагаю, что Django использует SQL LIMIT
, чтобы просто позволить базе данных выполнять тяжелую работу по сортировке того, что и сколько данных вернуть. Поскольку база данных оптимизирована для таких вещей, возможно, это разумный способ сделать это.
Ключ, вероятно, будет в том, чтобы сохранить запрос таким же, и, как вы продемонстрировали, вы можете использовать тот же самый вид для этого. Представление может просто иметь режим, который представляет собой причудливый способ изменения количества страниц разбивки на страницы.
Вы можете получить такие URL-адреса, как этот ...
# View all "landscape" items in gallery mode starting on page 3
http://www.example.com/gallery/landscape/multi/3
# View the 45th landscape item in singular mode
http://www.example.com/gallery/landscape/single/45
Когда рендеринг шаблона, paginator предложит методы has_next
и has_previous
, сообщающие вам, можете ли вы использовать визуализацию ссылки Next / Previous.
Вот что я думаю о представлении, или что-то в этом роде (это совершенно не проверено и списано с моей головы) ...
url(r'gallery/(?P<category>.+)/(?P<mode>.+)/(?P<offset>\d+)$', 'whatever.views.media_gallery'),
def media_gallery(request, category, mode, offset):
"""
Render a media gallery.
category = media item category filter
mode = ( multi | single )
offset = The pagination offset in multi mode or the media ID in single mode
"""
if mode == 'multi':
per_page = 20 # or however many items per page
elif mode == 'single':
per_page = 1
else:
pass # handle this however
# Queryitems
raw_media_items = Media.objects.filter(category=category)
# Setup paginator
paginator = Paginator(raw_media_items, per_page)
try:
# in multi mode offset is the page offset
# in single mode offset is the media ID
page = int(offset)
except:
page = 1
try:
media_items = paginator.page(page)
except (EmptyPage, InvalidPage):
media_items = paginator.page(paginator.num_pages)
if len(paginated_items) == 1:
# Render single view
return render_to_response('gallery/gallery_view.html',
{ 'media_item':media_items[0], 'paginator':paginator },
context_instance=RequestContext(request) )
else:
# Render gallery view
return render_to_response('gallery/gallery_view.html',
{ 'media_items':media_items, 'paginator':paginator },
context_instance=RequestContext(request) )