1.准备工作
1.1创建app,并注册
创建app
python manage.py startapp app01
注册
vim projectname/settings.py
INSTALLED_APPS = [
......
'app01.apps.App01Config'
]
1.2创建表
vim app01/models.py
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5,decimal_places=2)
def __str__(self):
return self.title
生成数据库
python manage.py makemigrations
python manage.py migrate
1.3生成数据
配置路由
vim projectname/urls.py
from app01 import views
urlpatterns = [
path('index/', views.index)
]
创建视图函数,批量导入数据(创建完后,将创建代码注释)
vim app01/views.py
from django.shortcuts import render,HttpResponse
from app01.models import *
# Create your views here.
def index(request):
book_list = []
for i in range(1,101):
book = Book(title="book_%s"%i,price=i*2)
book_list.append(book)
# 数据量过大时使用bulk_create创建
Book.objects.bulk_create(book_list)
return HttpResponse('666')
启动django,在浏览器运行http://127.0.0.1:8000/index/
,并查看数据库结果
1.4创建展示页面,查看数据信息
创建响应视图
vim app01/views.py
def index(request):
book_list = Book.objects.all()
return render(request, "index.html", locals())
创建展示页面(并没有做分页,只是将数据,一次性展示)
vim templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div>
{% for book in book_list %}
<p>{{ book.title }}-->{{ book.price }}</p>
{% endfor %}
</div>
<div>
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
<li><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</body>
</html>
2.常用方法
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def index(request):
book_list = Book.objects.all()
# 拿到一个分页器对象
paginator = Paginator(book_list, 10)
print("数据总数",paginator.count)
print("总页数",paginator.num_pages)
print("页码列表",paginator.page_range)
# 获取对应页对象
page = paginator.page(3)
#遍历对象(一)
for i in page:
print(i)
# 遍历对象(二)
print(page.object_list)
# 判断是否有上一页
print(page.has_previous())
# 判断是否有下一页
print(page.has_next())
# 下一页页码
print(page.next_page_number())
# 上一页页码
print(page.previous_page_number())
# 异常处理
try:
page_err = paginator.page(999)
except EmptyPage as e:
print("无效页(空页)",e)
try:
#可以为字符串的数字,内部会做int()转换
page_err = paginator.page('a')
except PageNotAnInteger as e:
print("页数不是数字",e)
return render(request, "index.html", locals())
3.完整分页代码展示
from django.shortcuts import render
from app01.models import *
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def index(request):
# 获取book对象列表
book_list = Book.objects.all()
# 获取分页器对象
paginator = Paginator(book_list, 2)
# 获取前端返回选中页码,如果没有则page_number为默认值1,get获取的值为字符串
# for k,v in request.GET.items():
# print(type(v))
current_page = int(request.GET.get("page",1))
#页对象
page = paginator.page(current_page)
#构建page_range
max_page_count = 11
max_page_count_half = int(max_page_count/2)
# 判断页数是否大于max_page_count
if paginator.num_pages >= max_page_count:
# 得出start位置
if current_page <= max_page_count_half:
page_start = 1
page_end = max_page_count + 1
else:
if current_page + max_page_count_half + 1 > paginator.num_pages:
page_start = paginator.num_pages - max_page_count
page_end = paginator.num_pages + 1
else:
page_start = current_page - max_page_count_half
page_end = current_page + max_page_count_half + 1
page_range = range(page_start, page_end)
else:
page_range = paginator.page_range
return render(request, "index.html", locals())
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
<div>
{% for book in page.object_list %}
<p>{{ book.title }}-->{{ book.price }}</p>
{% endfor %}
</div>
<div>
<nav aria-label="Page navigation">
<ul class="pagination">
{% if page.has_previous %}
<li>
<a href="?page={{ 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 %}
{% for number in page_range %}
{% if current_page == number %}
<li class="active"><a href="?page={{ number }}">{{ number }}</a></li>
{% else %}
<li><a href="?page={{ number }}">{{ number }}</a></li>
{% endif %}
{% endfor %}
{% if page.has_next %}
<li>
<a href="?page={{ 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>
</div>
</div>
</body>
</html>