Django高级之分页器组件
批量插入数据
模板层models.py
from django.db import models
class Books(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
publish = models.CharField(max_length=32)
数据库迁移
python3 manage.py makemigrations
python3 manage.py migrate
路由层urls.py
urlpatterns = [
url(r'^books_page/', views.books_page),
]
视图层views.py
# 往Book表里批量插入数据
def books_page(request):
# 第一种方案,每循环一次,操作一下数据库,性能低(相当于进行了1000次的数据库链接)
# for i in range(1000):
# book=models.Books.objects.create(name='图书%s'%i,price=i+10,publish='东京出版社')
#
# 第二种方案,批量插入
book_list=[] # 实例化对象放到列表里
for i in range(1000):
book=models.Books(name='图书%s'%i,price=i+10,publish='东京出版社')
book_list.append(book)
# bulk_create一次性插入,batch_size分批往里面插
models.Books.objects.bulk_create(book_list,batch_size=100)
return HttpResponse('ok')
# 当你想要批量插入数据的时候,使用ORM提供的 bulk_create 能够大大的减少操作时间
Django分页器
分页方法
from django.core.paginator import Paginator
def books_page(request):
book_list=models.Books.objects.all()
paginator=Paginator(book_list,10)
# Paginator对象的属性
print(paginator.count) # 数据总条数
print(paginator.num_pages) # 总页数
print(paginator.per_page) # 每页显示条数
print(paginator.page_range) # range(1, 101)
print(paginator.page(1))
# Page对象的属性和方法
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表
# number 当前页
page=paginator.page(2)
print(page.has_next())
print(page.next_page_number())
print(page.has_previous())
print(page.previous_page_number())
print(page.object_list)
print(page.number)
return render(request,'book_page.html',locals())
分页器终极用法
分页
-django提供的两个类
-Paginator类
-Pager类
后端
def books_page(request):
current_num = int(request.GET.get('page_num', 1))
book_list = models.Books.objects.all()
paginator = Paginator(book_list, 20)
try:
page = paginator.page(current_num)
except Exception as e:
current_num = 1
page = paginator.page(current_num)
if paginator.num_pages > 11:
if current_num - 5 < 1:
page_range = range(1, 12)
elif current_num + 5 > paginator.num_pages:
page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
else:
page_range = range(current_num - 5, current_num + 6)
else:
page_range = paginator.page_range
return render(request, 'book_page.html', locals())
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<script src="/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
<script src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">图书列表展示</h3>
</div>
<div class="panel-body">
<table class="table table-striped">
<thead>
<tr>
<th>id</th>
<th>书名</th>
<th>价格</th>
<th>出版社</th>
</tr>
</thead>
<tbody>
{% for book in page.object_list %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.name }}</td>
<td>{{ book.price }}</td>
<td>{{ book.publish }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
{% if page.has_previous %}
<li>
<a href="/books_page/?page_num={{ 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 foo in page_range %}
{% if current_num == foo %}
<li class="active"><a href="/books_page/?page_num={{ foo }}">{{ foo }}</a></li>
{% else %}
<li><a href="/books_page/?page_num={{ foo }}">{{ foo }}</a></li>
{% endif %}
{% endfor %}
{% if page.has_next %}
<li>
<a href="/books_page/?page_num={{ 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>
</div>
</div>
</div>
</div>
</body>
</html>

浙公网安备 33010602011771号