Джанго нумерация страниц | получить текущий индекс разбитого на страницы элемента в индексе страницы (не сам диапазон индекса страницы) - PullRequest
0 голосов
/ 31 марта 2010

Я пытаюсь создать фотогалерею с помощью Django.

Она настроена по категориям.

Я разбил результаты по категориям на n изображений на странице.Я также хочу использовать на странице пагинатор, который показывает только одно изображение и имеет кнопку «предыдущий / следующий» для предыдущего / следующего изображения в этой категории.

Я думал о том, чтобы получить текущий индекс для самого изображения и иметь ссылку на / category / CUR_IMG_ID_PAGINATION_LIST /, поскольку в результате разбиения на страницы всего набора будет получен тот же индекс, что и у текущего индекса изображения вразбитые на страницы результаты.

Например, если требуемое изображение - это изображение 45 из 150 изображений для категории, то при разбиении на страницы 150 изображений 45 будет фактическим номером страницы, которую я хочу.

Если есть более простой способ сделать это, дайте мне знать.Джанго 1.1

1 Ответ

0 голосов
/ 31 марта 2010

Я думаю, способ, которым вы описываете это, будет работать нормально, потому что за кулисами я полагаю, что 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) )
...