2010-03-31 12 views
0

J'essaye de construire une galerie de photo avec Django.Pagination Django | obtenir l'index actuel de l'élément paginé dans l'index de page, (pas la plage d'index de page elle-même)

Il est configuré par catégorie.

J'ai paginé les résultats d'une catégorie par n quantité d'images par page. Je veux également utiliser le paginateur sur la page qui montre juste l'image unique et avoir un bouton prev/next pour l'image prev/next dans cette catégorie. Ma pensée était d'obtenir l'index actuel pour l'image elle-même et que ce soit le lien vers/category/CUR_IMG_ID_PAGINATION_LIST/comme résultat de la pagination de l'ensemble donnerait le même index que l'index d'image actuel dans le paginé résultats. Par exemple si l'image que je veux est l'image 45 sur 150 images au total pour une catégorie, puis quand je paginerai les 150 images le 45 sera le nombre réel de la page que je veux.

S'il existe un moyen plus simple de le faire, faites le moi savoir. Django 1.1

Répondre

0

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))