django分頁查詢及對已經分頁的資料進行查詢,對條件查詢後的資料再次分頁
阿新 • • 發佈:2018-12-01
#適用於妹子UI的分頁前端,其他的也沒問題,稍做修改即可
#對已經分頁的資料進行查詢,對查詢後的資料再次進行分頁
#思路:url請求除了需要帶current page 還需要帶查詢的內容,以此判斷是否查詢後的資料分頁
直接上程式碼:
pages:包含兩個類1. Pagination表示對全部資料普通分頁 2. PaginationQuery表示對條件查詢結果進行分頁
#適用於妹子UI的分頁前端 #適用於所有資料分頁,普通分頁 class Pagination(object): #totalCnt代表表單內容總數量 def __init__(self,currentPage,perPageCnt,totalCnt,pageIndexCnt,urls): self.currentPage = currentPage self.perPageCnt = perPageCnt self.totalCnt = totalCnt self.pageIndexCnt = pageIndexCnt #表示分頁索引顯示幾個頁面,一般顯示5個 self.urls = urls #加上@property時,呼叫方法不用加() @property def page_nums(self): if self.totalCnt%self.perPageCnt == 0: return int(self.totalCnt/self.perPageCnt) else: return int(self.totalCnt/self.perPageCnt)+1 #其實條數,切片用 @property def startNum(self): return (self.currentPage-1)*self.perPageCnt @property def endNum(self): return self.currentPage*self.perPageCnt @property def prevPage(self): return self.currentPage-1 @property def nextPage(self): return self.currentPage+1 #分頁顯示頁碼,比如顯示: prev<< 4,5,6,7,8 >>next @property def pageRange(self): part = int(self.pageIndexCnt/2) if self.pageIndexCnt < self.page_nums: if self.currentPage < int(self.pageIndexCnt/2+1): return range(1,self.pageIndexCnt+1) elif self.currentPage > self.page_nums-part: return range(self.page_nums-self.pageIndexCnt,self.page_nums+1) else: return range(self.currentPage-part,self.currentPage+part+1) else: return range(1,self.page_nums+1) #直接輸送程式碼給模板 @property def pageStr(self): pageNumStr = [] prev_page="" next_page="" #頁碼 if self.currentPage>1 and self.currentPage<self.page_nums: prev_page = "<li><a href="+self.urls+"?p=%s>« Prev</a></li>"%(self.currentPage-1) next_page = "<li><a href="+self.urls+"?p=%s>Next »</a></li>"%(self.currentPage+1) if self.currentPage<=1: prev_page = "<li class='am-disabled'><a href='#'>« Prev</a></li>" if self.currentPage>=self.page_nums: next_page = "<li class='am-disabled'><a href='#'>Next »</a></li>" for page in self.pageRange: if page == self.currentPage: pageNumStr.append("<li class='am-active'><a href="+self.urls+"?p=%s>%s</a></li>"%(page,page)) else: pageNumStr.append("<li><a href=" + self.urls + "?p=%s>%s</a></li>" % (page, page)) print(pageNumStr) return prev_page+"".join(pageNumStr)+next_page #適用於妹子UI的分頁前端 #對已經分頁的資料進行查詢,對查詢後的資料再次進行分頁 #思路:url請求除了需要帶current page 還需要帶查詢的內容 class PaginationQuery(object): #content代表需要查詢的關鍵字 def __init__(self,currentPage,perPageCnt,totalCnt,pageIndexCnt,urls,content): self.currentPage = currentPage #當前頁碼 self.perPageCnt = perPageCnt #每頁要顯示多少條 self.totalCnt = totalCnt #totalCnt代表表單內容總數量 self.pageIndexCnt = pageIndexCnt #表示分頁索引顯示幾個頁面,一般顯示5個 self.urls = urls #請求路徑 self.content = content #查詢關鍵字 #加上@property時,呼叫方法不用加() @property def page_nums(self): if self.totalCnt%self.perPageCnt == 0: return int(self.totalCnt/self.perPageCnt) else: return int(self.totalCnt/self.perPageCnt)+1 #其實條數,切片用 @property def startNum(self): return (self.currentPage-1)*self.perPageCnt @property def endNum(self): return self.currentPage*self.perPageCnt @property def prevPage(self): return self.currentPage-1 @property def nextPage(self): return self.currentPage+1 #分頁顯示頁碼,比如顯示: prev<< 4,5,6,7,8 >>next @property def pageRange(self): part = int(self.pageIndexCnt/2) if self.pageIndexCnt < self.page_nums: if self.currentPage < int(self.pageIndexCnt/2+1): return range(1,self.pageIndexCnt+1) elif self.currentPage > self.page_nums-part: return range(self.page_nums-self.pageIndexCnt,self.page_nums+1) else: return range(self.currentPage-part,self.currentPage+part+1) else: return range(1,self.page_nums+1) #直接輸送程式碼給模板 @property def pageStr(self): pageNumStr = [] prev_page="" next_page="" #頁碼 if self.currentPage>1 and self.currentPage<self.page_nums: prev_page = "<li><a href="+self.urls+"?p=%s&content=%s>« Prev</a></li>"%(self.currentPage-1,self.content) next_page = "<li><a href="+self.urls+"?p=%s&content=%s>Next »</a></li>"%(self.currentPage+1,self.content) if self.currentPage<=1: prev_page = "<li class='am-disabled'><a href='#'>« Prev</a></li>" if self.currentPage>=self.page_nums: next_page = "<li class='am-disabled'><a href='#'>Next »</a></li>" for page in self.pageRange: if page == self.currentPage: pageNumStr.append("<li class='am-active'><a href="+self.urls+"?p=%s&content=%s>%s</a></li>"%(page,self.content,page)) else: pageNumStr.append("<li><a href=" + self.urls + "?p=%s&content=%s>%s</a></li>"%(page,self.content,page)) # print(pageNumStr) return prev_page+"".join(pageNumStr)+next_page
分頁資料views:
1 issueIndex 因為獲取的是所有值,進行普通分頁,呼叫Pagination
2 seleIssue 因為進行了條件查詢,所以對條件查詢後的內容進行分頁,呼叫PaginationQuery類
因為做專案,其他多餘程式碼請略過:
from django.shortcuts import render,HttpResponse,redirect from app1 import models from django import forms from django.db.models import F,Q from app1.views.pages import Pagination,PaginationQuery def issueIndex(request): issues = models.IssueList.objects.all().order_by("-issueDate") #分頁 currentPage = int(request.GET.get("p",1)) #當前頁,如果沒有預設1 perPageCnt = 10 #每頁顯示10個數據 totalCnt = models.IssueList.objects.all().count() #獲取全部資料個數 pageIndexCnt = 5 #顯示頁碼 5個, print(currentPage, "currentpage",totalCnt,pageIndexCnt,request.path) pagination = Pagination(currentPage,perPageCnt,totalCnt,pageIndexCnt,request.path) if currentPage > 0 and currentPage< pagination.page_nums: issues = issues[pagination.startNum:pagination.endNum] elif currentPage == pagination.page_nums: issues = issues[pagination.startNum::] else: issues = issues[0:10] return render(request,"issueIndex.html",{"issues":issues,"pagination":pagination}) def seleIssue(request): content = request.GET.get("content", None) #判斷是否有查詢內容 if content: issues = models.IssueList.objects.filter(Q(cusCompanyForIssue__companyName__icontains=content) | Q(issueType__name__icontains=content) | Q(issueContent__icontains=content) | Q(status__icontains=content) | Q(issueDept__dept__icontains=content)).order_by("-issueDate") else: issues = models.IssueList.objects.all().order_by("-issueDate") #分頁顯示 currentPage = int(request.GET.get("p", 1)) # 當前頁,如果沒有預設1 perPageCnt = 10 # 每頁顯示10個數據 totalCnt = issues.count() # 獲取全部資料個數 pageIndexCnt = 5 # 顯示頁碼 5個, print(currentPage, "currentpage", totalCnt, pageIndexCnt, request.path) #判斷是否有查詢,如果沒有就取全部index即可(呼叫PaginationQuery),如果有內容就呼叫PaginationQuery if content: pagination = PaginationQuery(currentPage, perPageCnt, totalCnt, pageIndexCnt, request.path,content) else: pagination = Pagination(currentPage, perPageCnt, totalCnt, pageIndexCnt, request.path) #獲取當前頁面要顯示的內容,使用切片模式 if currentPage > 0 and currentPage < pagination.page_nums: issues = issues[pagination.startNum:pagination.endNum] elif currentPage == pagination.page_nums: issues = issues[pagination.startNum::] else: issues = issues[0:10] return render(request, "issueIndex.html", {"issues": issues,"pagination":pagination}) def delIssue(request): cid = request.GET.get("cid",None) models.IssueList.objects.filter(id=cid).delete() return redirect("/issueIndex.html/") class addIssueForm(forms.Form): # 缺失時間 issueDate = forms.DateField() # 稽核人員 auditPerson = forms.CharField(max_length=128,required=False) # 缺失內容 issueContent = forms.CharField(max_length=256,required=False) # 改善對策 improve = forms.CharField(max_length=512,required=False) # 缺失狀態 status = forms.CharField(max_length=16,required=False) # 備註 mark = forms.CharField(max_length=256,required=False) # Status(隱藏) # hide = forms.BooleanField() def editIssue(request): if request.method=="GET": issueId = request.GET.get("cid",None) qses = models.QSMember.objects.all() issuedepts = models.IssueDept.objects.all() issueTypes = models.IssueType.objects.all() issue = models.IssueList.objects.filter(id=issueId).first() companys = models.CustomerInfo.objects.all() print(issue.cusCompanyForIssue.id) print(issue.hide) #locals()傳遞所有引數 return render(request,"editIssue.html",locals()) else: obj = addIssueForm(request.POST) cid = request.GET.get("cid",None) print(cid) companyId = request.POST.get("cusComanpyForIssue", None) issueType = request.POST.get("issueType", None) issueDept = request.POST.get("issueDept", None) qs = request.POST.get("issueListQS", None) hide = request.POST.get("hide", None) file = request.FILES.get("files") issueSite = request.POST.get("issueSite", None) issue = models.IssueList.objects.filter(id=cid) if obj.is_valid(): issue.update(**obj.cleaned_data,issueType_id=issueType,cusCompanyForIssue_id=companyId,issueSite=issueSite, issueDept_id=issueDept,issueListQS_id=qs,hide=hide) if file: #清除files 第一種寫法 models.UploadFile.objects.filter(issueFiles=cid).delete() import uuid, os from ctcqs import settings # 因為一直報錯FileNotFound,所以只能先這樣寫,真的是醉了,搞了好幾個小時了# 絕對路徑 filepath1 = os.path.join("issueList", str(uuid.uuid4()) + file.name) # 相對路徑 for以後使用 filepath = os.path.join(settings.MEDIA_ROOT, filepath1) # 建立file file_obj = models.UploadFile.objects.create(name=file.name, path=filepath1, size=file.size) # 因為一直路徑報錯,所以這裡準備改,結果成功了,算了 newfile = open(filepath, "wb") for item in file.chunks(): newfile.write(item) newfile.close() issue.first().files.add(file_obj) return redirect("/issueIndex.html/") def addIssue(request): if request.method=="GET": companys = models.CustomerInfo.objects.all() qses = models.QSMember.objects.all() issuedepts = models.IssueDept.objects.all() issueTypes = models.IssueType.objects.all() return render(request,"addIssue.html",{"companys":companys,"qses":qses,"issuedepts":issuedepts,"issueTypes":issueTypes}) else: obj = addIssueForm(request.POST) companyId = request.POST.get("cusComanpyForIssue",None) issueType = request.POST.get("issueType",None) issueDept = request.POST.get("issueDept",None) qs = request.POST.get("issueListQS",None) hide = request.POST.get("hide",None) issueSite = request.POST.get("issueSite", None) file = request.FILES.get("files") # print(obj) if obj.is_valid(): #新增issuelist Item print("是否隱藏", hide) issue = models.IssueList.objects.create(**obj.cleaned_data,issueType_id=issueType,cusCompanyForIssue_id=companyId, issueDept_id=issueDept,issueListQS_id=qs,hide=hide,issueSite=issueSite) #如果file不為空 if file: import uuid,os from ctcqs import settings # 因為一直報錯FileNotFound,所以只能先這樣寫,真的是醉了,搞了好幾個小時了# 絕對路徑 filepath1 = os.path.join("issueList", str(uuid.uuid4()) + file.name) # 相對路徑 for以後使用 filepath = os.path.join(settings.MEDIA_ROOT, filepath1) # 建立file file_obj = models.UploadFile.objects.create(name=file.name, path=filepath1, size=file.size) # 因為一直路徑報錯,所以這裡準備改,結果成功了,算了 newfile = open(filepath, "wb") for item in file.chunks(): newfile.write(item) newfile.close() issue.files.add(file_obj) return redirect("/issueIndex.html/")
前端純分頁HTML頁面,那個頁面需要的時候只需要引用進來即可
引用方式:
{% include "include/pageindexIssue.html" %}
分頁HTML內容:pageindexIssue.html,因為我做了首頁、尾頁、跳轉等,
實際上只要一句話即可做到完全分頁:
{{ pagination.pageStr|safe }}
<ul class="am-pagination am-pagination-centered"> <li>共{{ pagination.totalCnt }}條資料 </li> <li><a href="{{ pagination.urls }}?p=1">首頁</a></li> {{ pagination.pageStr|safe }} <li><a href="{{ pagination.urls }}?p={{ pagination.page_nums }}">尾頁</a></li> <li> 總頁數: {{ pagination.page_nums }} </li> <li> <input type="text" name="pageNum" id="pageNum" style="width: 60px"> <button type="button" class="am-btn am-btn-default am-btn-sm" onclick="fun()">跳轉頁</button> </li> </ul> <script> function fun() { var pageNum = document.getElementById('pageNum').value; window.location.href= '{{ pagination.urls }}?p='+pageNum; } </script>
分頁效果:
1 全部資料分頁:
2 條件查詢後內容分頁效果: