python - 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
解决方案
简单的调试过程:检查你得到了什么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)
推荐阅读
- java - 将所有值从一个类获取到另一个类方法
- php - 为 Ajax 解析 php 对象数组的正确方法
- javascript - 在定义为 JSON 的 Highchart 中禁用图例项单击
- python - 无法加载keras模型
- java - 单选按钮 - 小数位选项
- go - 如何使用 Go SDK for Google 云平台获取项目 ID?
- c# - 使用 Entity Framework Core 以编程方式“dotnet ef 数据库更新”
- ios - 如何在 iOS Swift 中将不同的角半径应用于 UIView 的不同角?
- bluetooth - 打开 BLE 传感器跟踪心率?
- firebase - 将已上传对象的 ACL 更改为 Firebase 存储