分页器对象没有属性“ get_page”

时间:2018-12-03 00:46:28

标签: django pagination

我正在django项目中尝试首次使用分页器。我在使其工作时遇到问题。当我运行它时,出现错误AttributeError:'Paginator'对象没有属性'get_page'。我已经试过了,但似乎无法解决。有人可以帮我吗?错误似乎是在“ babysitters = paginator.get_page(page)”行中

View.py文件

from django.shortcuts import render, get_object_or_404, get_list_or_404
from .models import Babysitter, Education, Reference, Work
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from .choices import numbers_choices, minder_choices, county_choices


# Create your views here.
def all_babysitters(request):
    babysitters = Babysitter.objects.all()
    
    paginator = Paginator(babysitters, 3)
  
    page = request.GET.get('page')
    babysitters = paginator.get_page(page)
    
    return render(request, "babysitters.html", {"babysitters": babysitters})

3 个答案:

答案 0 :(得分:3)

.get_page方法是在Django 2.0中添加的,所以我想您使用的是旧版本,也许是Django 1.11。对于此版本,请使用paginator.page(page),但请注意,当发现无效/找不到页面时,这可能会引发InvalidPage异常。

答案 1 :(得分:1)

除了使用Django-Rest-Framework之外,我还没有使用过Django,所以我将分享我的工作,希望您可以推断并用于常规Django。因此,以下是我构造分页响应的方法。

  1. 前端应用程序在URL的查询参数中发送页码
  2. 基于该页面,我对数据库查询进行分页
  3. 我返回结果以及分页信息

例如:

from django.core.paginator import Paginator
PAGE_SIZE = 20

def all_babysitters(request):
    p = request.query_params.get("page", 1)
    babysitters = Babysitter.objects.all()
    paginator = Paginator(babysitters, PAGE_SIZE)
    # page = paginator.page(p) # ~ Django 1.11
    # The following line was added, see comments below for why
    page = paginator.get_page(p) # Django 2.0 +
    nextpage = page.next_page_number() if page.has_next() else None
    data = BabySitterSerializer([i for i in page.object_list], many=True)
    pages = {
        "current": p,
        "next": nextpage,
        "total_pages": paginator.num_pages
        "total_results": paginator.count
    }
    return {
         "page_data": pages
         "data": data
    }

一个主要区别是使用序列化程序,我不知道是否需要常规Django,但是使用Django-Rest-Framework,您可以将查询结果返回到前端应用程序JSON格式。

希望有帮助:D

答案 2 :(得分:0)

这是我使用的工作代码。引用此blog

  

在views.py

from django.contrib.auth.models import User
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def index(request):
    user_list = User.objects.all()
    page = request.GET.get('page', 1)

    paginator = Paginator(user_list, 10)
    try:
        users = paginator.page(page)
    except PageNotAnInteger:
        users = paginator.page(1)
    except EmptyPage:
        users = paginator.page(paginator.num_pages)

    return render(request, 'core/user_list.html', { 'users': users })

然后您只需将其处理为html模板

  

user_list.html

<table class="table table-bordered">
  <thead>
    <tr>
      <th>Username</th>
      <th>First name</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    {% for user in users %}
      <tr>
        <td>{{ user.username }}</td>
        <td>{{ user.first_name }}</td>
        <td>{{ user.email }}</td>
      </tr>
    {% endfor %}
  </tbody>
</table>

{% if users.has_other_pages %}
  <ul class="pagination">
    {% if users.has_previous %}
      <li><a href="?page={{ users.previous_page_number }}">&laquo;</a></li>
    {% else %}
      <li class="disabled"><span>&laquo;</span></li>
    {% endif %}
    {% for i in users.paginator.page_range %}
      {% if users.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
        <li><a href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if users.has_next %}
      <li><a href="?page={{ users.next_page_number }}">&raquo;</a></li>
    {% else %}
      <li class="disabled"><span>&raquo;</span></li>
    {% endif %}
  </ul>
{% endif %}

我认为这对您会非常有帮助。