Loading

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>

最后启动服务访问即可查看到分页效果。当然也可以自己封装分页组件。

posted @ 2022-08-07 16:17  minqiliang  阅读(182)  评论(0编辑  收藏  举报
-->