1.先在app01中建表:
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(decimal_places=2,max_digits=8)
然后在终端写入python3 manage.py makemigrations ,python3 manage.py migrate写入到自带的数据库中
2.写路由,分配函数,制造数据
2.1写路由
from django.contrib import admin
from django.urls import path,re_path
from app01 import views as v1
urlpatterns = [
#分页器操作
path('fenye/',v1.fenye)
]
2.2分配函数 ,制造数据(在浏览器访问路由时就写进去了)
def fenye(request):
''' #批量插入
book_list=[]
for i in range(100):
book=Book(title="book_%s"%i,price=i)
book_list.append(book)
Book.objects.bulk_create(book_list)
然后就生成了一百条数据
3.写逻辑,写视图(都标注了)
3.1逻辑
from django.core.paginator import Paginator,EmptyPage #导入分页器;在浏览器输入框输入的值不合法时 try一下
def fenye(request):
''' #批量插入
book_list=[]
for i in range(100):
book=Book(title="book_%s"%i,price=i)
book_list.append(book)
Book.objects.bulk_create(book_list)
return render(request,"fenye.html")
'''
book=Book.objects.all()
# 分页器
page_obj=Paginator(book,3)#一页分几个数据
print('count :',page_obj.count) #数据总数
# count: 100
print('num_pages :',page_obj.num_pages) #总页数
# num_pages: 13
print('page_range :',page_obj.page_range) #页码的列表
# page_range: range(1, 14)
page_num = int(request.GET.get("page", 1)) # 默认给其第一页 page是url后的参数
print(page_num)#6 指当前点击的页数
if page_obj.num_pages>11: #前边数据 总页数
if page_num-5<1:
page_range =range(1,12)
elif page_num+5>page_obj.num_pages:
page_range=range(page_obj.num_pages-10,page_obj.num_pages+1)
else:#当不满足时显示其页面
page_range = range(page_num - 5, page_num + 6)
else:
page_range=page_obj.page_range
try:
#拿第几页数据的方式
page_num=int(request.GET.get("page",1)) #默认给其第一页 page是url后的参数 (意思是第几页)
page1=page_obj.page(page_num)#得到第几页页的数据
print(page1)#<Page 9 of 50>
#方式1
print("object_list:",page1.object_list)
# object_list: <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>, <Book: Book object (6)>, <Book: Book object (7)>, <Book: Book object (8)>]>
#方式二
for i in page1:
print(i) #拿到的是一个个对象,可以.title拿到书籍的名字
except EmptyPage as e :
page1 = page_obj.page(1) #出错给其page为1的页
# 查看页数http://127.0.0.1:8000/fenye/?page=15
return render(request,"fenye.html",locals())
3.2视图(fenye.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
{#<h3>插入成功</h3>#}
<ul>
{# 循环当前的page#}
{% for b in page1 %}
<li>{{ b.title }}:{{ b.price }}</li>
{% endfor %}
<nav aria-label="Page navigation">
<ul class="pagination">
{# 判断是否有上一页#}
{% if page1.has_previous %}
<li>
<a href="?page={{page1.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 %}
{# 点击页数给其颜色#}
{% for item in page_range %}
{% if page_num == item %}
<li class="active"><a href="?page={{ item }}">{{ item }}</a> </li>
{% else %}
<li ><a href="?page={{ item }}">{{ item }}</a> </li>
{% endif %}
{% endfor %}
{# 判断是否有下一页#}
{% if page1.has_next %}
<li>
<a href="?page={{ page1.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>
</ul>
</body>
</html>
结果: