首页 > 解决方案 > django中的分页不适用于第一页

问题描述

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

视图.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>

当我单击“第一个”时,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

标签: pythondjango

解决方案


简单的调试过程:检查你得到了什么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)

推荐阅读