2011-06-28 68 views
1

我是Django的新手,我正在構建一個投資組合的第一個項目。我需要一個分頁幫助的小小啓動。我有一個「索引」視圖,其中包含項目列表和每個項目的詳細視圖。在詳細視圖中,我想要一個功能可以在每個單獨的對象之間進行分頁。我已經通過了Pagination documenation並應用了我在索引視圖中學到的知識,但是當我嘗試使用我的詳細視圖做同樣的事情時,我得到一個TypeError,說我的「Project」類型的對象沒有len()。分類在Django中的詳細信息視圖

這裏是我的views.py代碼供參考的樣本。

def index(request): 
    all_projects = Project.objects.all().order_by('-pub_date') 
    paginator = Paginator(all_projects, 12) 

    try: 
     page = int(request.GET.get('page','1')) 
    except ValueError: 
     page = 1 

    try: 
     projects = paginator.page(page) 
    except (EmptyPage,InvalidPage): 
     projects = paginator.page(paginator.num_pages) 

    return render_to_response('portfolio/index.html', { 'all_projects':all_projects, 'projects':projects, 'MEDIA_URL':MEDIA_URL }) 

def detail(request, project_id): 
    project = get_object_or_404(Project, id=project_id)    
    return render_to_response('portfolio/detail.html', { 'project':project, 'MEDIA_URL':MEDIA_URL }) 

道歉,如果我的聲音的n00b上下的,因爲我,並提前感謝任何幫助另外,我讀這previous post但它沒」 t似乎適用於我,因爲我的觀點不是基於類的。

回答

0

我居然沒有通過Django的分頁該設置。我用這個代碼:

prev_issue = Issue.objects.filter(title=title).filter(number__lt=issue.number).order_by('-number')[:1] 
next_issue = Issue.objects.filter(title=title).filter(number__gt=issue.number).order_by('number')[:1] 

在你的情況,我會做這樣的事情,但你的東西必須filter,太:

prev_project = Project.objects.order_by('-pub_date')[:1] 
next_project = Project.objects.order_by('pub_date')[:1] 

然後把兩個上下文。

我也推薦django-pagination。我注意到你可能希望分頁留在索引上,對嗎? http://code.google.com/p/django-pagination/

你只需要弄亂模板代碼就可以了,效果很好。

5

Django已經內置get_next_by_FOO()/get_previous_by_FOO()方法whi ch會根據datetime-字段返回下一個/上一個對象。

您可以通過somethow像訪問這些模板:

<a href="{{ project.get_next_by_pub_date.get_absolute_url }}">{{ project.get_next_by_pub_date.title }}</a> 

我要說的是,這是在使用分頁爲首選的方法,你會得到一個不錯的網址,你可以在你的模型的定義每個項目都有get_absolute_url

要分頁,您需要一個QuerySet的實例,而不是一個對象!所以你應該用filter/all替換你的get_object_or_404。因此,它與列表視圖基本相同,但只需將號碼1傳遞給分頁符,就像您已經做的那樣!

+0

怎麼樣,如果涉及多個過濾器?如果我們想要從使用多個過濾器過濾的查詢集中獲取下一個/上一個項目? – Amyth

0

關於Django的好處是,幾乎所有常見編程問題都有代碼,您可以下載並在自己的項目中使用它。 (和大多數Django的包都是安靜寫得很好,太)

爲分頁退房http://pypi.python.org/pypi/django-pagination

它真的很容易安裝和設置,所以你不必去想分頁並專注於編寫軟件!

希望這會有所幫助,安東

0

在我看來。PY

def ProjectDetail(request,pk): 
    context = {} 
    template = 'views/projectdetail.html' 
    project = '' 
    prev = Project.objects.filter(pk__lt=pk).order_by('-pk')[:1] 
    next = Project.objects.filter(pk__gt=pk).order_by('pk')[:1] 
    try: 
    print(prev[0].pk) 
    print(next[0].pk) 
    except: 
     pass 
    project = Project.objects.filter(pk=pk) 
    context['categories'] = ProjectCategory.objects.all() 
    paginator = Paginator(project, 1) # Show 25 contacts per page 
    page = request.GET.get('page') 
    try: 
     data = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     data = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     data = paginator.page(paginator.num_pages) 
    if prev: 
    context['prev'] = prev[0].pk 
    if next: 
     context['next'] = next[0].pk 
    context['data'] = data 
    return render_to_response(template, context,context_instance=RequestContext(request)) 
在我的模板

我有

<div class="row"> 
    <a {% if next %} href="{% url 'task:project-detail' next %}"  class="btn btn-primary pull-right" {% else %} class="btn btn-primary pull-right disabled" {% endif %}>Next</a> 
    <a {% if prev %} href="{% url 'task:project-detail' prev %}" class="btn btn-primary pull-left" {% else %} class="btn btn-primary pull-left disabled" {% endif %} >Previous</a> 

</div> 
+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

我在答案中寫的代碼顯示瞭如何在詳細的基於功能的視圖中進行分頁,因爲作者的問題是在基於細節功能的視圖中進行分頁,如果我錯了,請更正我的感謝 –

+0

請不要只複製並粘貼[網站上其他地方]的答案(http://stackoverflow.com/a/31425080)。如果您覺得您的答案在那裏解決了這個問題,那麼正確的操作是將其標記爲重複。 – TZHX