分页器

一、项目的创建简介

1、在项目中新建应用:app01

python manage.py startapp app01

2、项目的一些预设置

1添加templates路径

首先,全局的settings.py中TEMPLATES加一下:

'DIRS': [os.path.join(BASE_DIR,'templates')],

2连接数据库相关

(2-1)在全局的settings.py文件中:

(A)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#上面是默认的,下面是自己创建的应用
'app01',
]

(B)

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql', #引擎,选mysql
    'NAME': 'pages', #要连接的数据库,连接前需要创建好
    'USER': 'root',  #连接数据库的用户名
    'PASSWORD': '123',  #连接数据库的密码
    'HOST': '127.0.0.1',  #连接主机,默认本本机
    'PORT': 3306,   #端口 默认3306
    }
}
(2-2)全局的init.py文件中:
import pymysql
pymysql.install_as_MySQLdb()
(2-3)在app01应用的models.py文件中加入数据库表的创建语句
from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(decimal_places=1,max_digits=5)
(2-4)然后在terminal中输入下面命令即可在数据库中创建相应的表:app01_book
python manage.py makemigrations
python manage.py migrate

3路由设置

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

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path('^pages/$',views.pages)
]

二、app01应用中函数pages的内容:

from django.shortcuts import render,HttpResponse
from app01.models import Book

def pages(request):
    '''
    ##批量创建数据库的条目————注意运行成功一次后就不要再运行了————bulk_create()方法
    book_list = []
    for i in range(100):
        book = Book(title='book_%s'%i,price=i*i)
        book_list.append(book)
    #批量创建
    Book.objects.bulk_create(book_list)
    '''
    
    ######下面是分页程序的具体实现######
    from django.core.paginator import Paginator,EmptyPage
    ##从数据库中获取所有书籍的条目
    book_list = Book.objects.all()
    #分页器,每页最多8个条目,剩余的放在最后一页
    paginator = Paginator(book_list,8)
    #数据的总数
    print('count:',paginator.count)
    #总页数
    print('num_pages:',paginator.num_pages)
    #页码的列表
    print('page_range:',paginator.page_range)
        
    #这里加一个“不存在的页面”的异常处理
    try:
        #当前页,默认是第一页
        current_page_c = int(request.GET.get('page',1))
        #由当前页码得到的当前页的对象
        current_page = paginator.page(current_page_c)
        ##显示某一页数据的两种方式
        #1
        print('object_list:',current_page.object_list)
        #2
        for i in current_page:
            print(i)
            
        #最多显示11个格子
        #注意下面的判断——保证最多显示11个格子且“左5右5”,如果有越限的进行限制
        #page_range_whw存的是range对象,控制前端分页栏个数
        if paginator.num_pages > 11:
            #如果“左5”越限
            if current_page_c-5 < 1:
                page_range_whw = range(1,11)
            #如果“右5”越限
            elif current_page_c+5 > paginator.num_pages:
                page_range_whw = range(paginator.num_pages-10,paginator.num_pages+1)    
            else:
                page_range_whw = range(current_page_c-5,current_page_c+6)
        else:
            page_range_whw = paginator.page_range   
        #如果页码不对,就返回到第一页
    except EmptyPage as e:
        current_page = paginator.page(1)
        
    return render(request,'pages.html',locals())

三、模板——pages.html

1、记得在head标签中引入bootstrap

<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.css">

2、获取数据库中所有的信息

<ul>
    {% for book in current_page  %}
        <li>{{ book.title }}:{{ book.price }}</li>
    {% endfor %}
</ul>

3、分页的具体实现——这里直接用bootstrap的分页组件

<nav aria-label="Page navigation">
    <ul class="pagination">
        {# 上一页按钮 #}
        {% if current_page.has_previous %}
            <li><a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
        {% else %}
            <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
        {% endif %}
        
        {# 对应页码的按钮——page_range_whw是后台传来的range对象,用于控制页码的数量  #}
        {% for item in page_range_whw %}
          {% if current_page_c == item %}
              <li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
          {% else %}
              <li><a href="?page={{ item }}">{{ item }}</a></li>
          {% endif %}
        {% endfor %}
        
        {# 下一页按钮 #}
        {% if current_page.has_next %}
        <li><a href="?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
        {% else %}
        <li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
        {% endif %}
        
    </ul>       
</nav>  
posted on 2019-05-19 11:56  江湖乄夜雨  阅读(131)  评论(0编辑  收藏  举报