Django----分頁器的使用


一、首先我們進入到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">&laquo;</span>
                          </a>
                        {%else%}
                        <span aria-hidden="true">&laquo;</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">&raquo;</span>
                              </a>
                            {%else%}
                            <span aria-hidden="true">&raquo;</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">&laquo;</span>
                          </a>
                        {%else%}
                        <span aria-hidden="true">&laquo;</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">&raquo;</span>
                              </a>
                            {%else%}
                            <span aria-hidden="true">&raquo;</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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM