1

Django でフォト ギャラリーを作成しようとしています。

カテゴリ別に設定しています。

カテゴリの結果をページあたり n 個の画像でページ分割しました。また、単一の画像のみを表示するページでページネーターを使用し、そのカテゴリの前/次の画像の前/次のボタンを使用したいと考えています。

私の考えは、画像自体の現在のインデックスを取得し、それを /category/CUR_IMG_ID_PAGINATION_LIST/ へのリンクにすることでした。これは、セット全体をページ分割した結果、ページ分割された結果の現在の画像インデックスと同じインデックスが生成されるためです。

たとえば、必要な画像がカテゴリの合計 150 枚の画像のうち 45 枚である場合、150 枚の画像をページ分割すると、45 枚が実際に必要なページ数になります。

これを行う簡単な方法があれば、教えてください。ジャンゴ1.1

4

1 に答える 1

1

舞台裏で 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) )
于 2010-03-31T03:18:14.383 に答える