在Django中分页详图视图

在Django中分页详图视图,django,django-views,Django,Django Views,我是Django的新手,我的第一个项目是建立一个投资组合。我还需要一点分页帮助。我有一个“索引”视图,其中包含项目列表和每个项目的详细视图。在细节视图中,我希望功能能够在每个单独的对象之间分页。我已经通过了,并应用了我在索引视图中学到的知识,但是当我尝试在细节视图中做同样的事情时,我得到一个类型错误,说我的“类型为'Project'的对象没有len() 以下是my views.py代码示例,供参考: def index( request ): all_projects = Project

我是Django的新手,我的第一个项目是建立一个投资组合。我还需要一点分页帮助。我有一个“索引”视图,其中包含项目列表和每个项目的详细视图。在细节视图中,我希望功能能够在每个单独的对象之间分页。我已经通过了,并应用了我在索引视图中学到的知识,但是当我尝试在细节视图中做同样的事情时,我得到一个类型错误,说我的“类型为'Project'的对象没有len()

以下是my 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,我表示歉意,并提前感谢您的帮助。此外,我读过这篇文章,但它似乎不适用于我,因为我的视图不是基于类的。

Django有内置方法,它将根据
datetime
-字段返回下一个/上一个对象

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

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

我想说的是,与使用分页相比,这是首选方法,因为您将获得一个很好的url,您可以在模型的
get_absolute\u url
中为每个项目定义该url

要分页,您需要一个
QuerySet
实例,而不是一个对象!因此,您应该用
过滤器
/
全部
来替换
get\u object\u或\u 404
调用。因此它基本上与列表视图相同,但只需将编号
1
传递给分页器,就像您已经做的那样!

Django有内置的方法它将根据
datetime
-字段返回下一个/上一个对象

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

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

我想说的是,与使用分页相比,这是首选方法,因为您将获得一个很好的url,您可以在模型的
get_absolute\u url
中为每个项目定义该url


要分页,您需要一个
QuerySet
实例,而不是一个对象!因此,您应该用
过滤器
/
全部
来替换
get\u object\u或\u 404
调用。因此,它基本上与列表视图相同,但只需将编号
1
传递给分页器,就像您已经做的那样!

关于Django的伟大之处就是说,几乎每个常见的编程问题都有代码,您可以下载并在自己的项目中使用(而且大多数django软件包都写得很好)

对于分页签出

它的安装和设置非常容易,所以您不必考虑分页,而只需专注于编写软件


希望这能有所帮助,Anton

Django的伟大之处在于,几乎每个常见的编程问题都有代码,您可以下载并在自己的项目中使用。(而且大多数Django软件包都写得非常好)

对于分页签出

它的安装和设置非常容易,所以您不必考虑分页,而只需专注于编写软件


希望这有帮助,Anton

我实际上没有通过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]
在您的情况下,我会这样做,但您也必须通过某种方式进行过滤:

prev_project = Project.objects.order_by('-pub_date')[:1]
next_project = Project.objects.order_by('pub_date')[:1]
然后把两者放在上下文中

我还建议使用django分页。我注意到您可能希望分页保持在索引上,对吗


您只需修改模板代码,效果很好。

我实际上没有通过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]
在您的情况下,我会这样做,但您也必须通过某种方式进行过滤:

prev_project = Project.objects.order_by('-pub_date')[:1]
next_project = Project.objects.order_by('pub_date')[:1]
然后把两者放在上下文中

我还建议使用django分页。我注意到您可能希望分页保持在索引上,对吗

您只需修改模板代码,效果就很好。

在my 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>

在我的视图中.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>


如果它涉及多个过滤器呢?如果我们想从使用多个过滤器过滤的查询集中获取下一个/上一个项目呢?如果它涉及多个过滤器呢?如果我们想从使用多个过滤器过滤的查询集中获取下一个/上一个项目呢?这并不能回答问题。若要评论或要求作者澄清,请在他们的帖子下方留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的评论,你就可以发表。我在回答中编写的代码显示了如何在基于详细函数的视图中分页,因为作者的问题是在基于详细函数的视图中分页查看如果我错了请更正我谢谢不要只是复制和粘贴来自的答案。如果您觉得您的答案解决了此问题,正确的操作是将其标记为重复。这不会提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时发表评论我在回答中写的代码显示了如何在基于详细函数的视图中分页,因为作者的问题是在基于详细函数的视图中分页,如果我错了,请更正我,谢谢。请不要只是从中复制和粘贴答案。如果你觉得你的答案ere解决了此问题,正确的操作是将其标记为重复。