分页的基础知识
首先我们要在views.py 文件中引入:
from django.core.paginator import Paginator
下面是详细的介绍, 其中Data 代表数据库中的数据
d1 = Data(name='张三')
d2 = Data(name='李四')
result = Data.objects.all()
# 设置分页信息
# 值1: 当前所有数据的个数
# 值2: 每页显示多少条数据
p = Paginator(result, 3)
print('商品个数,', p.count)
print('总页数', p.num_pages)
print('页码范围', p.page_range)
print('获取第一页', p.page(1))
all = p.page(1).object_list
print('第一页所有数据:', all)
for data in all:
print(data.name)
for data in p.page(2).object_list:
print(data.name)
print('获取第二页数据')
# 获取当前页的页码
print(p.page(2).number)
page2 = p.page(2)
# 是否有上一页
print(page2.has_previous())
# 是否有下一页
print(page2.has_next())
# 除了本页面,是否有其他页面
print(page2.has_other_pages())
# 获取上一页页码
print(page2.previous_page_number())
# 获取下一页页码
print(page2.next_page_number())
# 指定页面内部的元素 第一个的索引
print(page2.start_index())
# 指定页面内容的元素, 最后一个的索引
print(page2.end_index())
Django分页的实例
首先是创建项目,设置settings文件,新建templates文件,在里面新建index.html, 新建static 复制bootstrap那三个文件进来。 并在index.html 中通过{% load static %}引入文件, 下面的script也要引入文件。
在models文件中写入数据库的字段,最后在myPro 文件的init文件引入pymysql, 并进行数据迁移
这里放上views.py 文件, 和index.html 文件。
所有详细的解释 都是代码中响应的位置
views.py 文件:
from django.shortcuts import render
from django.http import HttpResponse
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
import random
# Create your views here.
from .models import Goods
def index(request):
# for x in range(200):
# good = Goods(name='good%s' %x, des='该商品便宜,只需{}元'.format(random.randint(10,100)))
# good.save()
return HttpResponse('数据添加成功')
def select(request):
good_list = Goods.objects.all()
# 值1: 当前所有数据的个数
# 值2: 每页显示多少条数据
# 值3:当最后一页数据少于n条时,将数据并入上一页
paginator = Paginator(good_list, 12, 3)
try:
# GET请求方式 get()获取指定Key值所对应的Value值
# 获取index的值 如果没有 则设置使用默认值1
num = request.GET.get('index', '1')
# number 表示某一页的内容
number = paginator.page(num)
except PageNotAnInteger:
# 如果输入的页码数不是是整数 那么显示第一页数据
number = paginator.page(1)
except EmptyPage:
# 如果页码数不在当前页码范围内 则显示最后一页
# paginator.num_pages 获取当前总页数
# paginator.page()获取指定的某一页
number = paginator.page(paginator.num_pages)
# number代表一页的内容, paginator代表所有页的内容
return render(request, 'index.html', {'page': number, 'paginator': paginator})
index.html 文件
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="{% static 'css/bootstrap.css'%}">
<title>Title</title>
</head>
<body>
{% for good in page %}
<h4>{{good.name}} -- {{good.des}}</h4>
{% endfor%}
<ul class="pagination">
{% if page.has_previous %}
{# 点击a标签 跳转到上一页链接 ?index= 为地址后面拼接的参数 #}
<li><a href="?index={{page.previous_page_number}}">上一页</a></li>
{% else %}
<li class="disabled"><a href="#">上一页</a></li>
{% endif%}
{% for count in paginator.page_range %}
{# count 是循环出来的数字, page.number 是某一页的页码 #}
{% if count == page.number %}
<li class="active"><a href="?index={{count}}">{{count}}</a></li>
{% else %}
<li><a href="?index={{count}}">{{count}}</a></li>
{% endif%}
{# 看起来是一样的,其实是若是循环出来的数字 和页码相等,#}
{# 就是目前在那一页 那么它就被class=active 渲染。 就是页码的框的是蓝色的#}
{% endfor%}
{% if page.has_next %}
<li>
<a href="?index={{ page.next_page_number}}">下一页</a>
</li>
{% else %}
<li class="disabled">
<a href="#">下一页</a>
</li>
{% endif %}
</ul>
<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'js/bootstrap.js' %}"></script>
</body>
</html>
最后的结果如图:
最后放上两个需要注意的地方,
static文件的作用