當(dāng)數(shù)據(jù)庫量比較大的時候一定要分頁查詢的
在django中操作數(shù)據(jù)庫進(jìn)行分頁
queryset = models.PrettyNum.objects.all() #查詢所有
queryset = models.PrettyNum.objects.all()[0:10] #查詢出1-10列
queryset = models.PrettyNum.objects.filter(mobile__contains='136')[0:10] #查詢出符合條件的前10列
queryset = models.PrettyNum.objects.all().count() #查詢有多少條數(shù)據(jù),返回的是一個數(shù)字
#第一頁
queryset = models.PrettyNum.objects.all()[0:10]
#第二頁
queryset = models.PrettyNum.objects.all()[10:20]
#第三頁
queryset = models.PrettyNum.objects.all()[20:30]
1、封裝分頁的插件類
這個分頁插件要實(shí)現(xiàn)的是如下效果,當(dāng)前頁和前5頁,后5頁,上一頁和下一頁,還有首頁和尾頁
在app01下創(chuàng)建一個分頁的的工具類,pagination.py
pagination.py的內(nèi)容:
在初始化函數(shù)中,需要的參數(shù)有
request:請求的對象,通過對象獲取url傳的參數(shù)
queryset:符合條件的數(shù)據(jù)(根據(jù)這個數(shù)據(jù)庫給他鏡像分頁處理)
page_size: 每頁顯示多少條數(shù)據(jù), 不傳默認(rèn)顯示10條數(shù)據(jù)庫
page_param:在URL中傳遞的獲取分頁的參數(shù),例如 /pretty/list/?page=12, 默認(rèn)是page
plus: 顯示當(dāng)前頁的前或后幾頁(頁碼),默認(rèn)是5
在初始化函數(shù)中計(jì)算出總頁數(shù)
在函數(shù)html就是生成html頁面,最后返回這個頁碼html頁面的字符串
from django.utils.safestring import mark_safe
class Pagination():
def __init__(self,request,queryset,page_size=10,page_param="page",plus=5):
"""
:param request: 請求的對象
:param queryset: 符合條件的數(shù)據(jù)(根據(jù)這個數(shù)據(jù)庫給他鏡像分頁處理)
:param page_size: 每頁顯示多少條數(shù)據(jù)
:param page_param: 在URL中傳遞的獲取分頁的參數(shù),例如 /pretty/list/?page=12
:param plus: 顯示當(dāng)前頁的前或后幾頁(頁碼)
"""
page = request.GET.get(page_param,"1")
if page.isdecimal():
page = int(page)
else:
page = 1
self.page = page
self.page_size = page_size
self.start = (page-1)* page_size
self.end = page * page_size
self.page_queryset = queryset[self.start:self.end]
total_count = queryset.count()
total_page_count,div = divmod(total_count,page_size)
if div:
total_page_count += 1
self.total_page_count = total_page_count
self.plus = plus
def html(self):
#計(jì)算出,顯示當(dāng)前頁的前5頁,后5頁
if self.total_page_count <= 2 * self.plus + 1:
#數(shù)據(jù)庫中的數(shù)據(jù)比較少,沒有11頁
start_page = 1
end_page = self.total_page_count
else:
# 數(shù)據(jù)庫中的數(shù)據(jù)比較多,大于11頁
# 當(dāng)前頁<5時,(小級值)
if self.page <= self.plus:
start_page = 1
end_page = 2 * self.plus + 1
else:
# 當(dāng)前頁大于5
#當(dāng)前頁 + 5 > 總頁面
if (self.page + self.plus) > self.total_page_count:
start_page = self.total_page_count - 2*self.plus
end_page = self.total_page_count
else:
start_page = self.page - self.plus
end_page = self.page + self.plus
# 頁碼
page_str_list = []
page_str_list.append('<li><a href="?page={}">首頁</a></li>'.format(1))
# 上一頁
if self.page > 1:
prev = '<li><a href="?page={}">上一頁</a></li>'.format(self.page -1)
else:
prev = '<li><a href="?page={}">上一頁</a></li>'.format(1)
page_str_list.append(prev)
#頁面
for i in range(start_page,end_page + 1):
if i == self.page:
ele = '<li class="active"><a href="?page={}">{}</a></li>'.format(i,i)
else:
ele = '<li><a href="?page={}">{}</a></li>'.format(i, i)
page_str_list.append(ele)
# 下一頁
if self.page < self.total_page_count:
prev = '<li><a href="?page={}">下一頁</a></li>'.format(self.page + 1)
else:
prev = '<li><a href="?page={}">下一頁</a></li>'.format(self.total_page_count)
page_str_list.append(prev)
# 尾頁
page_str_list.append('<li><a href="?page={}">尾頁</a></li>'.format(self.total_page_count))
search_string = """
<li>
<form style="float:left; margin-left: -1px" method="get">
<input name="page" style="position: relative;float: left;display: inline-block;width: 80px;border-radius: 0" type="text" class="form-control" placeholder="頁碼">
<button style="border-radius: 0" class="btn btn-default" type="submit">跳轉(zhuǎn)</button>
</form>
</li>
"""
page_str_list.append(search_string)
page_string = mark_safe("".join(page_str_list))
return page_string
2、在視圖函數(shù)中使用頁碼類
在views.py 中導(dǎo)入類,實(shí)例化類,通過context 把內(nèi)容傳給頁面
from django.shortcuts import render,redirect,HttpResponse
from django import forms
from app01 import models
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError
from app01.utils.pagination import Pagination
def pretty_list(request):
"""靚號列表"""
data_dict = {}
search_data = request.GET.get('q',"")
if search_data:
data_dict['mobile__contains'] = search_data
#從數(shù)據(jù)庫查詢到數(shù)據(jù),排序,使用order_by ,-level表示降序,level升序
queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")
page_obj = Pagination(request,queryset)
context={
"search_data": search_data,
"queryset": page_obj.page_queryset, #分頁的數(shù)據(jù)
"page_string":page_obj.html() #頁碼
}
return render(request,'pretty_list.html',context)
3、在html中展示頁碼
在pretty_list.html的底部加上顯示頁面的
不管在哪個頁面需要使用頁碼,只需要在要展示的地方加上下面的頁碼展示的就可以了,具體有多少頁,根據(jù)數(shù)據(jù)條數(shù),自動生成在page_string 變量中文章來源:http://www.zghlxwxcb.cn/news/detail-632737.html
<nav aria-label="Page navigation">
<ul class="pagination">
{{ page_string }}
</ul>
</nav>
pretty_list.html的整體代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-632737.html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div style="margin-bottom: 10px">
<a class="btn btn-success" href="/pretty/add/">新建靚號</a>
<div style="float: right; width: 300px">
<form method="get">
<div class="input-group">
<input type="text" name="q" class="form-control" placeholder="手機(jī)號搜索" value="{{ search_data }}">
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading"><span class="glyphicon glyphicon-list" aria-hidden="true"></span> 靚號列表</div>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>號碼</th>
<th>價格</th>
<th>級別</th>
<th>狀態(tài)</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in queryset %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.mobile }}</td>
<td>{{ obj.price }}</td>
<td>{{ obj.get_level_display }}</td>
<td>{{ obj.get_status_display }}</td>
<td>
<a class="btn btn-primary btn-xs" href="/pretty/{{ obj.id }}/edit/">編輯</a>
<a class="btn btn-danger btn-xs" href="/pretty/{{ obj.id }}/delete/">刪除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<nav aria-label="Page navigation">
<ul class="pagination">
{{ page_string }}
</ul>
</nav>
</div>
{% endblock %}
到了這里,關(guān)于django處理分頁的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!