分页器
一、项目的创建简介
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>