Je pense que la façon dont vous décrivez cela fonctionnerait bien parce que derrière les scènes, je crois que ce que Django fait est d'utiliser un SQL LIMIT
pour simplement laisser la base de données faire le tri de données. revenir. Parce que la base de données est optimisée pour faire ce genre de chose, c'est probablement un moyen raisonnable d'y parvenir. La clé sera probablement de garder la même requête et comme vous avez démontré que vous pourriez utiliser la même vue pour le faire. La vue pourrait simplement avoir un mode qui est une façon élégante de changer le nombre de pages de pagination.
Vous pourriez finir avec urls comme celui-ci ...
# 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
Lorsque le modèle est rendu, le paginator offrira les has_next
et has_previous
méthodes vous permettant de savoir si vous pouvez utiliser un rendu suivant/précédent lien .
Voici ce que je pense pour la vue, ou quelque chose dans ce sens (ce qui est tout à fait non testé et écrit sur le dessus de ma tête) ...
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))