舞台裏で Django が行っていることはLIMIT
、データベースに SQL を使用して、返すデータの種類と量を整理するという面倒な作業を単純に任せているためです。データベースはこの種のことを行うために最適化されているため、これはおそらくこれを実行する合理的な方法です。
重要なのは、おそらくクエリを同じに保つことです。これまでに示したように、同じビューを使用してそれを行うことができます。ビューには、ページネーションのページ数を変更するための派手な方法であるモードを単純に含めることができます。
このような 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
テンプレートがレンダリングされると、ページネーターは次/前のリンクのレンダリングを使用できるかどうかを知らせるhas_next
およびメソッドを提供します。has_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) )