一、首先我們進入到shell命令下查看相關的信息:
python manage.py shell ----->執行此條命令后進入shell命令
1.在shell命令模式下創建新的博客:
>>> from blog.models import Blog >>> blog = Blog()#首先要進行實例化操作 >>> dir() ['Blog', '__builtins__', 'blog']
2.創建之前需要導入需要的一些模塊:在shell命令下創建30篇文章。
>>> for i in range(1,31): ... blog = Blog() ... blog.title = 'for i%s'%i ... blog.content = 'wwwwwww i%s'%i ... blog.author = User.objects.all()[0] ... blog.typename = Blogtype.objects.all()[0] ... blog.save() ... >>> >>> Blog.objects.count()
3.我們可以查詢到很多的方法首先導入分頁器:
from django.core.paginator import Paginator---->django核心代碼導入分頁器。
form blog.modles import Blog
blogs = Blog.objects.all()
paginator = Paginator(blogs,10)-------------------->開始分頁傳入所有的值,以及10篇內容為一頁。
===========這里會出現一個問題,因為前面我們創建的內容是一個無序的沒有編號的內容===========
因此我們先要調整一下modles里面的代碼:
class Blog(models.Model):
title = models.CharField(max_length = 30)
typename = models.ForeignKey(Blogtype,on_delete = models.DO_NOTHING)
content = models.TextField()
create_time = models.DateTimeField(auto_now_add=True)
up_dated_time = models.DateTimeField(auto_now=True)
author = models.ForeignKey(User,on_delete=models.DO_NOTHING)
def __str__(self):
return "<Blog%s>"%self.title
class Meta:
ordering = ['-create_time']
1.首先來看看paginator常用的方法:
'count', 'get_page', 'num_pages', 'object_list', 'orphans', 'page', 'page_range', 'per_page', 'validate_number']
paginator.count------->統計所有的博客數量
get_page:用來處理用戶的非法輸入--------->page_of_blogs = paginator.get_page(page_num)
object_list:用來遍歷出當前頁的頁面內容
page_range:---->用來顯示底部頁碼。
num_pages------->顯示總的頁數
2.獲取某頁:
page1 = paginator.page(1)
>>> page1 = paginator.page(1) >>> page1 <Page 1 of 4>
3.以下是page1所可以使用的方法:
'count', 'end_index', 'has_next', 'has_other_pages', 'has_previous', 'index', 'next_page_number', 'number', 'object_list', 'paginator',
'previous_page_number', 'start_index'
page1.number------------------->顯示當前頁的頁碼
has_previous--------------->{#判斷是否存在上一頁#}
has_next--------------->{#判斷是否存在下一頁#}
previous_page_number------------------------->{#判斷當前上一頁所在位置#}
next_page_number------------------------->{#判斷當前下一頁所在位置#}
二、分頁器的使用:
{#分頁器#} <ul class="pagination"> <li> {%if page_of_blogs.has_previous%}{#判斷是否存在上一頁#} <a href="?page={{page_of_blogs.previous_page_number}}" aria-label="Previous">{#previous_page_number判斷當前頁#} <span aria-hidden="true">«</span> </a> {%else%} <span aria-hidden="true">«</span> {%endif%} </li> {#總的頁數#} {%for page_num in page_of_blogs.paginator.page_range%} <li><a href="?page={{page_num}}"><span>{{page_num}}</span></a></li> {%endfor%} {#判斷是否存在下一頁#} <li> {%if page_of_blogs.has_next%} <a href="?page={{page_of_blogs.next_page_number}}" aria-label="Next"> <span aria-hidden="true">»</span> </a> {%else%} <span aria-hidden="true">»</span> {%endif%} </li> </ul>
def bloglist(request): blogs = Blog.objects.all() paginator = Paginator(blogs,10)#每10篇文章分一頁 page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號 page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值 contenx = {} contenx['page_of_blogs'] = page_of_blogs # contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['blogtypes'] = Blogtype.objects.all()#獲取所有的分類 return render_to_response('blog/list.html',contenx)
三、分頁器的優化:如果有大量的內容時,前面的方法分頁器就會很長,所以需要優化!
1.current_page_num (是獲取當前頁的頁碼)使用number方法:
rang_page = 獲取的是一個頁碼的范圍:[current_page_num-2,current_page_num-1,current_page_num-2,current_page_num+1,current_page_num+2]即可獲得當前頁,前兩頁和后兩列的頁數。這樣我們發現多了一些數字,0,-1頁等是我們不需要的,因此我們讓當前的數例如1-2會得到-1,我們將它和1作對比取最大的那個,到單前頁的范圍。這樣在最小值這里我們就截掉了我們不需要的數字,最大的方向也是一樣的,只不過我們要取小的那個值。
blogs = Blog.objects.all() paginator = Paginator(blogs,2)#每10篇文章分一頁 page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號 page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值 current_page_num = page_of_blogs.number#獲得當前頁 # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(當前到---->想要的那個值取到最后最小的那個值
2.為了繼續優化,添加首頁和尾頁:這樣我們就可以插入1和最大的那個頁數
if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages)
3.添加省略號。
#添加省略號 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...')
4.優化模板文件:
{#分頁器#} <div class="paginator"> <ul class="pagination"> <li> {%if page_of_blogs.has_previous%} {#判斷是否存在上一頁#} <a href="?page={{page_of_blogs.previous_page_number}}" aria-label="Previous">{#previous_page_number判斷當前頁#} <span aria-hidden="true">«</span> </a> {%else%} <span aria-hidden="true">«</span> {%endif%} </li> {#總的頁數#} {%for page_num in range_page%} {% if page_num == page_of_blogs.number %} <li class="active"> <span>{{page_num}}</span> </li>{#當前頁高亮#} {% else %} {% if page_num == '...' %} <li><span>{{page_num}}</span></li> {% else %} <li> <a href="?page={{page_num}}"> {{page_num}} </a> </li> {% endif %} {% endif %} {%endfor%} {#判斷是否存在下一頁#} <li> {%if page_of_blogs.has_next%} <a href="?page={{page_of_blogs.next_page_number}}" aria-label="Next"> <span aria-hidden="true">»</span> </a> {%else%} <span aria-hidden="true">»</span> {%endif%} </li> </ul> <p>(共{{page_of_blogs.paginator.num_pages}}頁,當前{{page_of_blogs.number}}頁,共有{{page_of_blogs.paginator.count}}篇博客)</p> </div> </div>
5.視圖函數修改:
def bloglist(request): blogs = Blog.objects.all() paginator = Paginator(blogs,2)#每10篇文章分一頁 page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號 page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值 current_page_num = page_of_blogs.number#獲得當前頁 # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(當前到---->想要的那個值取到最后最小的那個值) #添加省略號 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...') #添加首頁和尾頁 if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages) contenx = {} contenx['page_of_blogs'] = page_of_blogs contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['range_page'] = range_page contenx['blogtypes'] = Blogtype.objects.all()#獲取所有的分類 return render_to_response('blog/list.html',contenx)
四、分類列表頁面展示:
def blog_with_type(request,typename_pk): contenx ={} typename = get_object_or_404(Blogtype,pk = typename_pk)#拿到傳入的類型參數 blogs = Blog.objects.filter(typename=typename)#篩選的頁面 paginator = Paginator(blogs,2)#每10篇文章分一頁 page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號 page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值 current_page_num = page_of_blogs.number#獲得當前頁 # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值 range_page = list(range(max(current_page_num-2,1),current_page_num))+\ list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1)) # range(當前到---->想要的那個值取到最后最小的那個值) #添加省略號 if range_page[0]-1>=2: range_page.insert(0,'...') if paginator.num_pages-range_page[-1]>=2: range_page.append('...') #添加首頁和尾頁 if range_page[0]!=1: range_page.insert(0,1) if range_page[-1]!=paginator.num_pages: range_page.append(paginator.num_pages) contenx['page_of_blogs'] = page_of_blogs contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章 # contenx['count'] = Blog.objects.all().count() contenx['range_page'] = range_page contenx['typename'] = typename#顯示分類列 contenx['blogtypes']= Blogtype.objects.all()#獲取所有的分類 return render_to_response('blog/blog_with_type.html',contenx)
五、每頁顯示數量參數設置:
在settings里面設置后(大寫)引入模塊。
from django.conf import settings
