Django中使用分页功能
Django中使用分页功能
(1) 创建一个名为MyDjango的项目,再创建一个名为index的app,在settings.py中注册改app,配置数据库
(2) 在index的models.py中定义模型PersonInfo,并执行数据迁移
from django.db import models
class PersonInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
(3) 在MyDjango和index的urls.py中定义路由信息
# MyDjango的urls.py
from django.urls import path, include
urlpatterns = [
path('', include(('index.urls', 'index'), namespace='index')),
]
# index的urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('<page>/', index, name='index'),
]
(4) 在index的views.py中定义视图函数index,视图函数查询模型PersonInfo的所有数据,并进行分页处理
from django.shortcuts import render
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
from .models import PersonInfo
def index(request, page):
# 获取模型PersonInfo的全部数据
person = PersonInfo.objects.all().order_by('-age')
# 设置每一页的数据量为2
p = Paginator(person, 2)
try:
pages = p.page(page)
except PageNotAnInteger:
# 如果参数page的数据类型不是整型,就返回第一页数据
pages = p.page(1)
except EmptyPage:
# 若用户访问的页数大于实际页数,则返回最后一页的数据
pages = p.page(p.num_pages)
return render(request, 'index.html', locals())
(5) 在templates文件夹中创建index.html,内容如下:
<!DOCTYPE html>
<html lang="zh-hans">
<head>
{% load static %}
<title>分页功能</title>
<link rel="stylesheet" href="{% static "css/base.css" %}"/>
<link rel="stylesheet" href="{% static "css/lists.css" %}">
</head>
<body class="app-route model-hkrouteinfo change-list">
<div id="container">
<div id="content" class="flex">
<h1>分页功能</h1>
<div id="content-main">
<div class="module filtered" id="changelist">
<form id="changelist-form" method="post">
<div class="results">
<table id="result_list">
<thead>
<tr>
<th class="action-checkbox-column">
<div class="text">
<span><input type="checkbox"/></span>
</div>
</th>
<th><div class="text">姓名</div></th>
<th><div class="text">年龄</div></th>
</tr>
</thead>
<tbody>
{% for p in pages %}
<tr>
<td class="action-checkbox">
<input type="checkbox" class="action-select">
</td>
<td>{{ p.name }}</td>
<td>{{ p.age }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<p class="paginator">
{# 上一页的路由地址 #}
{% if pages.has_previous %}
<a href="{% url 'index:index' pages.previous_page_number %}">上一页</a>
{% endif %}
{# 列出所有的路由地址 #}
{% for n in pages.paginator.page_range %}
{% if n == pages.number %}
<span class="this-page">{{ pages.number }}</span>
{% else %}
<a href="{% url 'index:index' n %}">{{ n }}</a>
{% endif %}
{% endfor %}
{# 下一页的路由地址 #}
{% if pages.has_next %}
<a href="{% url 'index:index' pages.next_page_number %}">下一页</a>
{% endif %}
</p>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
最后启动服务访问即可查看到分页效果。当然也可以自己封装分页组件。