2010-03-31 72 views
0

我想用Django構建一個照片庫。Django分頁|得到頁索引中的分頁項目的當前索引,(而不是頁面索引範圍本身)

它是按類別設置的。

我已經爲每頁圖片數量n分頁了結果。我還想在頁面上使用paginator來顯示單個圖像,併爲該類別中的prev/next圖像提供prev/next按鈕。

我的想法是獲取圖像本身的當前索引,並將其作爲/ category/CUR_IMG_ID_PAGINATION_LIST /的鏈接,因爲分頁整個集合的結果會產生與分頁中的當前圖像索引相同的索引結果。

例如,如果我想要的圖像是一個類別的150個圖像總共的圖像45,那麼當我分頁150個圖像時,45將是我想要的頁面的實際數量。

如果有更簡單的方法來做到這一點,讓我知道。 Django 1.1

回答

0

我認爲你描述它的方式可以正常工作,因爲在幕後我相信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 

當模板被渲染,在分頁程序將提供has_nexthas_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))