2009-04-14 63 views
9

我目前正在開發一個Django應用程序,它將利用臭名昭着的「分頁」技術。我想弄清楚django.core.paginator模塊是如何工作的。Django分頁和「當前頁」

我有一個問題模型的應用程序。我將使用此分頁程序列出所有問題。每頁有20個問題。

def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    page  = ... # Somehow figure out which page the question is on 
    return render_to_response('show_question.html', { 'page' : page }) 

在視圖中,在這裏我列出了不同的頁面爲 「... 2,3,4 ,5,6,......」 我想以某種方式突出顯示當前頁,像許多網頁做。

實際上有兩兩件事我想知道:

  1. 如何使Django的找出問題所在,在哪一頁?
  2. 如何編寫我的模板以恰當地「突出顯示」當前訪問的頁面?

編輯:對不起,我忘了這個問題的一部分。我還希望除當前頁面之外的任何頁面都鏈接到/questions/{{ that_page.start_index }}。所以基本上每個頁面鏈接都會鏈接到該頁面上的第一個問題。

+0

比如你是什麼意思,你想,除了目前每個網頁鏈接到該網頁上的問題嗎?用戶將如何更改頁面? – 2009-04-14 14:45:15

+0

我不想傳遞任何?page = 4 GET請求參數或任何東西。我只會在問題4中使用/ question/4,然後視圖會找出問題所在的頁面。這就是頁面鏈接真正針對問題的原因。 – 2009-04-14 15:16:55

+0

頁面上的第一個問題是否會隨着更多問題的添加或可能排序而發生變化?從REST/HTTP的角度來看,這意味着URL不會引用真實資源。這就是爲什麼Django使用GET參數:註釋URL標識的資源的顯示特性。 – 2009-04-15 01:21:10

回答

7

嗯......我從你的評論中看到,你不想做ol'GET參數,這是django.core.paginator寫的。要做你想做的事,我可以想到沒有比預先計算每個問題所在的頁面更好的方法。舉個例子,你的觀點最終會被這樣的:

ITEMS_PER_PAGE = 20 
def show_question(question_pk): 
    questions = Question.objects.all() 
    for index, question in enumerate(questions): 
     question.page = ((index - 1)/ITEMS_PER_PAGE) + 1 
    paginator = Paginator(questions, ITEMS_PER_PAGE) 
    page = paginator.page(questions.get(pk=question_pk).page) 
    return render_to_response('show_question.html', { 'page' : page }) 

爲了突出在模板當前頁面,你會做這樣的事情

{% for i in page.paginator.page_range %} 
    {% ifequal i page.number %} 
     <!-- Do something special for this page --> 
    {% else %} 
     <!-- All the other pages --> 
    {% endifequal %} 
{% endfor %} 

至於項目,你會有兩個不同的object_lists與...一起工作...

page.object_list 

會在當前頁面中的對象和

page.paginator.object_list 

將所有對象,無論頁面。這些項目中的每一個都會有一個「頁面」變量,它會告訴你他們在哪個頁面上。

這一切都說,你在做什麼聽起來非常規。你可能想重新思考,但無論如何,祝你好運。

5

django-pagination應該做你想要的,幷包裝在一個漂亮的包中,你可以插入和使用。它基本上將代碼從視圖移動到模板和中間件。

編輯:我剛纔看到你的編輯。 您可以使用{% autopaginate object_list %}獲取頁面上的當前對象,該頁面用任何給定頁面的當前對象替換object_list。你可以遍歷它,如果你想要第一個,你應該能夠像列表一樣對待它,並做object_list[0]

如果你想保持這個你的觀點中,你可以做這樣的事情:

def show_question(question_pk): 
    questions = Question.objects.all() 
    paginator = Paginator(questions, 20) 
    return render_to_response('show_question.html', { 'page' : paginator }) 

在你的模板,您可以通過訪問當前頁面你在:

# Gives you the starting index for that page. 
# For example, 5 objects, and you're on the second page. 
# start_index will be 3. 
page.start_index 

# You can access the current page number with: 
# 1-based index 
page.number 

因此,你應該能夠做你需要的一切。 有幾個很好的例子here

10

版本1.2中的Django,at least允許我們通過使用純默認分頁模板標籤來完成此任務。

{% for page in article_list.paginator.page_range %} 
    {% if page == article_list.number %} 
    {{ page }} 
    {% else %} 
    <a href="/page{{ page }}">{{ page }}</a> 
    {% endif %} 
{% endfor %} 

凡article_list是

paginator = Paginator(article_list, 20) 
    try: 
     article_list = paginator.page(int(page)) 
    except (EmptyPage, InvalidPage): 
     article_list = paginator.page(paginator.num_pages)