Django(二十)分页:

Posted chenxi188

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django(二十)分页:相关的知识,希望对你有一定的参考价值。

一、知识点

参考:https://docs.djangoproject.com/zh-hans/3.0/topics/pagination/

查询出所有省级地区的信息,显示在页面上。

AeroInfo.objects.filter(aParent__isnull = True)

1) 查询出所有省级地区的信息。

2) 按每页显示10条信息进行分页,默认显示第一页的信息,下面并显示出页码。

3) 点击i页链接的时候,就显示第i页的省级地区信息。

from django.core.paginator import Paginator
paginator = Paginator(areas, 10) #按每页10条数据进行分页

Paginator类对象的属性:

属性名 说明
num_pages 返回分页之后的总页数
page_range 返回分页后页码的列表

Paginator类对象的方法:

方法名 说明
page(self, number) 返回第number页的Page类实例对象

Page类对象的属性:

属性名 说明
number 返回当前页的页码
object_list 返回包含当前页的数据的查询集
paginator 返回对应的Paginator类对象

Page类对象的方法:

属性名 说明
has_previous 判断当前页是否有前一页
has_next 判断当前页是否有下一页
previous_page_number 返回前一页的页码
next_page_number 返回下一页的页码

二、分页实例

1)app1/models.py写地区模型类

from django.db import models

class AreaInfo(models.Model):
    '''地址模型类'''
    # 地区名称
    atitle = models.CharField(verbose_name='标题', max_length=20)
    # 自关联属性
    aParent = models.ForeignKey('self', null=True, blank=True,on_delete=models.CASCADE)

    def __str__(self):
        return self.atitle

    def title(self):
        return self.atitle
    title.admin_order_field = 'atitle'
    title.short_description = '地区名称'

    def parent(self):
        if self.aParent is None:
            return ''
        return self.aParent.atitle
    parent.short_description = '父级地区名称'

2)app1/views.py写显示函数

from django.shortcuts import render
from django.http import HttpResponse
from app1.models import AreaInfo #导入图片模型类


# /index
def index(request):
    return render(request,'app1/index.html')

# /show_areas
# 前端访问的时候,需要传递页码
from django.core.paginator import Paginator #【0】导入分页模块
def show_areas(request):
    '''分页显示地区'''
    areas=AreaInfo.objects.filter(aParent__isnull=True) #【1】过滤父级为空的地区,即省区
    paginator=Paginator(areas,10) #【2】把省区进行分页,每页显示10条
    page=paginator.page(1) #【3】获取第一页试试
    return render(request,'app1/show_areas.html',{'page':page}) # 【4】返回第一页给模板。传所有区数据'areas':areas

3)模板templates/app1/show_areas.html

<!DOCTYPE html>
<html>
<head>
    <title>显示地区</title>
</head>
<body>

    <ul>
        {% for a in page %}
        <li>{{a.atitle}}</li>
        {% endfor %}
    </ul>

</body>
</html>

4)配置urls.py

from django.contrib import admin
from django.urls import path
from app1 import views

urlpatterns = [
    path('index/', views.index),

    path('show_upload/',views.show_upload),# 图片上传页
    path('upload_handle/',views.upload_handle),# 图片上传处理页

    path('show_areas/',views.show_areas), #显示地区
]

5)效果:http://127.0.0.1:8000/show_areas/

显示第一页十条数据:
北京市
天津市
河北省
山西省
内蒙古自治区
辽宁省
吉林省
黑龙江省
上海市
江苏省

2.2完整的分布实例

1)模板templates/app1/show_areas.html

<!DOCTYPE html>
<html>
<head>
    <title>显示地区</title>
</head>
<body>
    <ul>
        {# 遍历获取每一条数据 #}
    {#  {% for area in page.object_list %}#}
    {% for area in page %}
        <li>{{ area.atitle }}</li>
    {% endfor %}
</ul>
{# 判断是否有上一页 #}
{% if page.has_previous %}
    <a href="/show_areas{{ page.previous_page_number }}">&lt;上一页</a>
{% endif %}

{# 遍历显示页码的链接 #}
{% for pindex in page.paginator.page_range %}
    {# 判断是否是当前页 #}
    {% if pindex == page.number %}
        {{ pindex }}
    {% else %}
        <a href="/show_areas{{ pindex }}">{{ pindex }}</a>
    {% endif %}
{% endfor %}

{# 判断是否有下一页 #}
{% if page.has_next %}
    <a href="/show_areas{{ page.next_page_number }}">下一页&gt;</a>
{% endif %}
    </ul>

</body>
</html>

2)app1/views.py

from django.shortcuts import render
from django.http import HttpResponse
from project1.settings import MEDIA_ROOT #导入上传文件保存路径 或 from django.conf import settings
from app1.models import PicTest,AreaInfo #导入图片模型类


# /index
def index(request):
    return render(request,'app1/index.html')

# /show_areas
# 前端访问的时候,需要传递页码pindex
from django.core.paginator import Paginator #【0】导入分页模块
def show_areas(request,pindex):
    '''分页显示地区'''
    # 1.查询出所有省级地区的信息
    areas = AreaInfo.objects.filter(aParent__isnull=True)
    # 2. 分页,每页显示10条
    paginator = Paginator(areas, 10)

    # 3. 获取第pindex页的内容
    if pindex == '':
        # 默认取第一页的内容
        pindex = 1
    else:
        pindex = int(pindex)
    # page是Page类的实例对象
    page = paginator.page(pindex)
    return render(request,'app1/show_areas.html',{'page':page}) # 【4】返回第一页给模板。

3)配置urls.py

from django.contrib import admin
from django.urls import path,re_path
from app1 import views

urlpatterns = [
    path('index/', views.index),

    path('show_upload/',views.show_upload),# 图片上传页
    path('upload_handle/',views.upload_handle),# 图片上传处理页

    #path('show_areas/',views.show_areas), #显示地区

    re_path(r'show_areas(?P<pindex>d*)', views.show_areas), # 分页
]

效果:http://127.0.0.1:8000/show_areas

技术图片
技术图片

以上是关于Django(二十)分页:的主要内容,如果未能解决你的问题,请参考以下文章

python运维开发(二十)----models操作中间件缓存信号分页

二十七CI框架之自己写分页类并加载(写分页还是有难度,搞了一整天)

《80X86汇编语言程序设计教程》二十三 分页管理机制实例

如何在 Django Summernote 中显示编程片段的代码块?

django实现分页功能

Django REST框架分页的jQuery代码