2 django系列之django分頁與templatetags


preface

當頁面出現的條目多的時候,我們就需要使用分頁功能了。Django作為一個知名的web框架,自然也提供了分頁功能,下面說說它。

Python-shell 練練手

在python下入手

先創建一個操作對象
>>> hehe = ['ljf','richer','wang',1,2,3]
>>> hehe
['ljf', 'richer', 'wang', 1, 2, 3]
表示每頁兩份,表示把hehe這個列表每一頁2份數據
>>> p = Paginator(hehe,2)       #表示每頁兩份,表示把hehe這個列表每一頁2份數據
>>> p
<django.core.paginator.Paginator object at 0x0000000000B75630>
統計多少個值
>>> p.count           #統計多少個值
6
統計多少頁
>>> p.num_pages         #統計多少頁
3
查看頁數
>>> p.page_range     #查看頁數
range(1, 4)
取第一頁的內容
>>> p1=p.page(1)       #取第一頁的內容
>>> p1
>>> p1.object_list
['ljf', 'richer']
獲取第二頁
>>> p2=p.page(2)                 
>>> p2
<Page 2 of 3>
顯示當前頁內容
>>> p2.object_list
['wang', 1]
判斷是否有一下頁
>>> p2.has_next() #判斷是否有一下頁
True
判斷是否有上一頁
>>> p1.has_previous()            # 判斷是否有上一頁
False  
判斷是否還有其他頁
>>> p1.has_other_pages()          # 判斷是否還有其他頁
True

在html中使用分頁功能

在html中,我們需要使用django 的templatetags功能來實現動態顯示當前頁的前后3頁,避免頁數過大導致頁碼太長。這個功能可以參考官網的例子(https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/)。

我們首先查看項目目錄,自己寫的tag在app下面新建一個目錄templatetags,必須是這個名字:

[root@salt devops]# tree BatchM
BatchM
├── Batch
│   ├── templatetags
│   │   ├── custom_tag.py   # 這個就是自己定義的tag.
│   │   ├── __init__.py
custom_tag.py的內容

from django import template

from django.utils.html import format_html
register = template.Library()   # 注冊到tempate庫里面


@register.filter   # filter只能對一個參數傳入有效,調用到時候這樣用  {{ xx.line  | ljf_power}} 
def ljf_lower(val):    #這個僅僅是測試練習寫的代碼,可以忽略。
    return val.lower()


@register.simple_tag()     # simple_tag能夠對傳入多個參數有效
def guess_page(current_page,loop_num):
    '''

    :param current_page:  當前頁
    :param loop_num:     頁數范圍
    :return:
    '''

    offset = abs(current_page - loop_num)
    if offset < 3:   # 表示取當前頁的前后三頁
        if current_page == loop_num :
            page_element = '''       
            <li class="active"><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
            '''%(loop_num,loop_num)                 # 拼html代碼
        else:
            page_element = '''
            <li><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
            '''%(loop_num,loop_num)
        return format_html(page_element)
    else:
        return ''                 # 必須寫一個return 空字符串,這樣就不會在前端頁面顯示None
我們再看看調用這個tags的html代碼
提前引入bootstrap,jquery。
{% load custom_tag %}           # 需要引用剛才創建的tag
''''省略其他代碼N行
            <nav>
              <ul class="pagination">
                {% if contacts.has_previous %}    <!-- 判斷是否有首頁  -->
                    <li class="disabled"><a href="#">&laquo;</a></li>
                {% endif %}

                  {% for page_num in contacts.paginator.page_range %}
                      {% guess_page contacts.number  page_num %}    <!--   guess_page 直接寫剛才在tag里面定義的方法,  contacts.numer表示時當前頁,page_num表示for循環到元素-->
                  {% endfor %}

              {% if contacts.has_next %}           <!-- 判斷是否有下一頁 -->
                 <li class="disabled"><a href="#">&raquo;</a></li>
              {% endif %}
              </ul>
            </nav>
再看views里面的代碼:
def apply_update_search(request):
    '''
    :param request:
    :return:
    '''
    if request.method == 'GET':
        records = models.WorkOrderOfUpdate.objects.filter(username=request.user.get_username()).order_by('OrderId').reverse()  #數據庫搜索
        page = request.GET.get('page')        # 與前端頁面的a標簽鏈接保持一致
        try:
            contacts = pageinator.page(page)
        except PageNotAnInteger:      # 如果輸入到不是一個數字,發送第一頁
            contacts = pageinator.page(1)
        except EmptyPage:   # 如果獲取到超過來頁數范圍,那么就返回最后一頁。
            contacts = pageinator.page(pageinator.num_pages)
        return render(request,'apply_update.html',{'btitle':'搜索操作記錄','contacts':contacts})

url配置
url(r"apply_update.html/search",views.apply_update_search,name='post_order_id') 

以上功能完成后,就可以實現這樣的功能:


免責聲明!

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



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