Django中的分页不适用于第一页

2024-10-03 21:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在django中实现分页。当我尝试单击一个按钮,该按钮应该将我重定向回第一页,甚至获取第一页的内容时,我遇到了一个问题

views.py


    else:
        all_tasks = TaskList.objects.all()
        paginator = Paginator(all_tasks, 5)
        page = request.GET.get('pg')

        all_tasks = paginator.get_page(page)


        context = {
            'all_tasks': all_tasks
        }
        return render(request, 'index.html', context)

html代码

<nav aria-label="Page navigation example">
  <ul class="pagination justify-content-end">
    <li class="page-item"><a class="page-link" href="?pg=1">First</a></li>
    {% if all_tasks.has_previous %}
     
      <li class="page-item"><a class="page-link" href="?pg={{ all_tasks.previous_page_number }}">{{ all_tasks.previous_page_number }}</a></li>
    {% endif %}

      <li class="page-item"><a class="page-link" href="?pg={{ all_tasks.number }}">{{ all_tasks.number }}</a></li>
    
    {% if all_tasks.has_next %}
      <li class="page-item"><a class="page-link" href="?pg={{ all_tasks.previous_page_number }}">{{ all_tasks.previous_page_number }}</a></li>
     
    {% endif %}
    <li class="page-item"><a class="page-link" href="?pg={{ all_tasks.paginator.num_pages }}">Last</a></li>
   
  </ul>
</nav>

当我单击“first”时,django抛出这些错误。请帮忙。 django抛出的错误是

EmptyPage at /task/
That page number is less than 1
Request Method: GET
Request URL:    http://127.0.0.1:8000/task/
Django Version: 3.1.5
Exception Type: EmptyPage
Exception Value:    
That page number is less than 1
Exception Location: C:\Users\BernardMuendi\.virtualenvs\TaskMate-R1pilZ9L\lib\site-packages\django\core\paginator.py, line 50, in validate_number
Python Executable:  C:\Users\BernardMuendi\.virtualenvs\TaskMate-R1pilZ9L\Scripts\python.exe
Python Version: 3.8.6
Python Path:    
['C:\\Users\\BernardMuendi\\Desktop\\TaskMate\\taskmate',
 'c:\\program files\\python38\\python38.zip',
 'c:\\program files\\python38\\DLLs',
 'c:\\program files\\python38\\lib',
 'c:\\program files\\python38',
 'C:\\Users\\BernardMuendi\\.virtualenvs\\TaskMate-R1pilZ9L',
 'C:\\Users\\BernardMuendi\\.virtualenvs\\TaskMate-R1pilZ9L\\lib\\site-packages']
Server time:    Tue, 16 Feb 2021 09:49:50 +0000

Tags: numberpagelinkliallitemusersclass
2条回答

试试这个

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

all_tasks = TaskList.objects.all()
paginator = Paginator(all_tasks, 5)
page = request.GET.get('pg', 1)
try:       
   all_tasks = paginator.page(page)
except PageNotAnInteger:
    all_tasks = paginator.page(1)
except EmptyPage:
   all_tasks = paginator.page(paginator.num_pages)
   
    

参考https://docs.djangoproject.com/en/3.1/topics/pagination/

简单的调试过程:检查您在page = request.GET.get('pg')中得到了什么 下面是paginator.get_page(page)的内部代码。所以,检查一下为什么int(number)小于1

def validate_number(self, number):
    """Validate the given 1-based page number."""
    try:
        if isinstance(number, float) and not number.is_integer():
            raise ValueError
        number = int(number)
    except (TypeError, ValueError):
        raise PageNotAnInteger(_('That page number is not an integer'))
    if number < 1:
        raise EmptyPage(_('That page number is less than 1'))
    if number > self.num_pages:
        if number == 1 and self.allow_empty_first_page:
            pass
        else:
            raise EmptyPage(_('That page contains no results'))
    return number

def get_page(self, number):
    """
    Return a valid page, even if the page argument isn't a number or isn't
    in range.
    """
    try:
        number = self.validate_number(number)
    except PageNotAnInteger:
        number = 1
    except EmptyPage:
        number = self.num_pages
    return self.page(number)

相关问题 更多 >