Django2 +MySQL8 分页功能分析

访客 阅读:172 2021-03-31 18:17:14 评论:0

本文转载至:https://www.jianshu.com/p/6682ed701f65

分页类:Paginator

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)

必选参数:

  1. objects_list : 必须是列表/元组或Django所生成的QuerySet对象,或具有count()__len __()方法的其他可切片对象。
  2. per_page: 每页显示多少个数量,是一个整数

可选参数:

  1. orphans: 默认值为零,无论最后一页剩余多少条数据,都另起一页,否则将剩余的合并到上一页,举例:假如当前分页一共11页,第11页的只有两条数据,那么我们定义orphans=2,则分页总数剩余10页,最后两条数据合并到第10页。
  2. allow_empty_first_page: 是否允许第一页为空。 如果为False同时object_list为空,则将引发EmptyPage错误,默认值为True.

Paginator的方法,2.0版后新增:

  1. Paginator.get_page(number) 方法:返回当前页页码,并具有处理超出页码范围和无效页码的状况,页码不是数字返回第一页,超出返回最后一页
  2. Paginator.page(number)方法: 返回指定页码的内容,如果给定的页码不存在,则引发InvalidPage。

属性:

  1. Paginator.count: 所有页面中的对象总数。
  2. Paginator.num_pages: 分页总数
  3. Paginator.page_range: 迭代页码,返回的是一个[1,2,3,4,...]这样的列表。

了解了上边这些之后我们既可以在模板中直接使用Page对象所提供的方法,直接使用!

Page objects对象中的方法及属性:

  1. Page.has_next()如果有下一页返回True.
  2. Page.has_previous() 如果有上一页返回True.
  3. Page.has_other_pages() 如果同时具有上下页返回True.
  4. Page.next_page_number() 返回下一页的页码.
  5. Page.previous_page_number() 返回上一页的页码.
  6. Page.start_index() 返回当前页面的第一条数据.
  7. Page.end_index() 返回当前页的最后一条数据

属性

  1. Page.object_list 此页上的对象列表。
  2. Page.number此页的基于 1 的页码。
  3. Page.paginator关联的 Paginator 对象。



实例Demo:

views.py

from django.core.paginator import Paginator 
from django.shortcuts import render 
 
 
# 分页查询 
def lists(request): 
    lists = Books.objects.all() 
    paginator = Paginator(lists, 2, orphans=2, ) 
    pages = paginator.page_range  # 生成所有页码 
    pages_num = paginator.num_pages  # 总也数 
    gd_page = paginator.page(1)  # 调用指定页面的内容 
    page = request.GET.get('page')  # 当前页面 
    contacts = paginator.get_page(page)  # 当前页并具有处理超出页码范围的状况,页码不是数字返回第一页,超出返回最后一页 
    return render(request, 'lists.html', {'contacts': contacts, 'pages': pages, 'pagenums': pages_num, 'gd_page': gd_page})

urls.py

from django.conf.urls import url 
from . import views 
 
urlpatterns = [ 
    url('lists/', views.lists, name='lists'), 
]

项目配置文件settings.py 

TEMPLATES = [ 
    { 
        'BACKEND': 'django.template.backends.django.DjangoTemplates', 
        # 模板文件存储位置 
        'DIRS': ['E:/python_workspace/blogsite/template'], 
        'APP_DIRS': True, 
        'OPTIONS': { 
            'context_processors': [ 
                'django.template.context_processors.debug', 
                'django.template.context_processors.request', 
                'django.contrib.auth.context_processors.auth', 
                'django.contrib.messages.context_processors.messages', 
            ], 
        }, 
    }, 
]

模板文件template/lists.html

{% for contact in contacts %} 
        <li>{
  { contact.book_name }}</li> 
        <li>{
  { contact.book_price }}</li> 
    {% endfor %} 
 
    <h1>分页练习</h1> 
 
{% if contacts.has_previous %} 
    <li>上一页页码:{
  { contacts.previous_page_number }}</li> 
    <a href="?page={
  { contacts.previous_page_number }}">上一页</a> 
{% endif %} 
    <li>当前页码:{
  { contacts.number }}</li> 
{% if contacts.has_next %} 
    <li>下一页页码:{
  { contacts.next_page_number }}</li> 
    <a href="?page={
  { contacts.next_page_number }}">下一页</a> 
{% endif %} 
 
    {
  { contacts.start_index }} 
    {
  { contacts.end_index }} 
 
   <p> 所有页码:</p> 
    <div class="pagetions"> 
 
{% for page in pages %} 
    {% if page == contacts.number %} 
        <a class="active" href="?page={
  { page }}">{
  { page }}</a> 
    {% else %} 
        <a href="?page={
  { page }}">{
  { page }}</a> 
    {% endif %} 
{% endfor %} 
 
</div> 
总页数:{
  { pagenums }} 
{% for gd in gd_page %} 
   <li>{
  { gd }}</li> 
    {% endfor %} 
给定页码:{
  { gd_page }}

项目结构图:

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
关注我们

一个IT知识分享的公众号