在Django中分页细节视图

时间:2011-06-28 05:00:14

标签: django django-views

我是Django的新手,我的第一个项目是我正在建立一个投资组合。我需要一点点启动分页帮助。我有一个“索引”视图,其中包含项目列表和每个项目的详细视图。在详细视图中,我希望一个功能能够在每个单独的对象之间进行分页。我已经浏览了Pagination documenation并将我学到的内容应用于索引视图但是当我尝试使用我的详细视图执行相同的操作时,我得到一个TypeError,说我的“类型'对象'对象没有len( )。

以下是我的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-ish,并提前感谢任何帮助。另外,我读了这个previous post,但它似乎并不适用于我,因为我的观点不是基于类的。

4 个答案:

答案 0 :(得分:5)

Django有内置的get_next_by_FOO()/get_previous_by_FOO()方法,它们将返回取决于datetime字段的下一个/上一个对象。

你可以通过以下方式在模板中访问它们:

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

我想说这是使用分页的首选方法,因为您将获得一个很好的网址,您可以在模型的get_absolute_url中为每个项目定义!

要分页,您需要一个QuerySet的实例,而不是一个对象!因此,您应该使用get_object_or_404 / filter替换all来电。所以它与列表视图基本相同,但只是将数字1传递给分页器,就像你已经做的那样!

答案 1 :(得分:0)

关于Django的好处是,几乎每个常见的编程问题都有代码,您可以在自己的项目中下载和使用。 (而且大多数django套餐都写得很安静)

分页检查http://pypi.python.org/pypi/django-pagination

安装和设置非常简单,因此您无需考虑分页并专注于编写软件!

希望这会有所帮助,安东

答案 2 :(得分: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/

你只需要弄乱模板代码,它就会很好用。

答案 3 :(得分:0)

在我的views.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>