Django實現分頁和表格搜索功能

前言:在百度上查找django分頁功能非常之多,但可用的技術文檔寥寥無幾。分頁雖說只是我們開發項目中一個很小的功能,但實現它是十分必要且必須的。因為實現分頁功能,能使我們更加清楚明了地查看頁面信息。

一、django分頁功能的實現(使用django封裝的pagination分頁器)
話不多說,直接上代碼,再對代碼作清楚的解析(我想各位看官就明白是咋回事了)
1、后臺代碼:

        limit = 10
        p = Paginator(data, limit)  # 實例化一個分頁對象
        page = request.GET.get('page')  # 獲取頁碼
        # print('我是page------------',page)
        # print('我是id------------',primary_domain_id)
        if page:
            pass
        else:
            page = 1
        try:
            a_a = p.page(page)  # 獲取某頁對應的記錄
            page1 = p.page(page)
            page_list = page1.object_list
        except PageNotAnInteger:  # 如果頁碼不是個整數
            a_a = p.page(1)  # 取第一頁的記錄
        except EmptyPage:  # 如果頁碼太大,沒有相應的記錄
            a_a = p.page(p.num_pages)  # 取最后一頁的記錄

        return render(request, 'domain_dns/second_domain_query_list.html', {'primary_domain_id':primary_domain_id,'page_list':page_list,'hostlist_search_q':hostlist_search_q,'second_list_obj': a_a,'p':p})

a、上述的代碼中:p = Paginator(data, limit) # 實例化一個分頁對象,data可以是從數據庫表(django的models實例化的<class Query>對象),也可以是python原生的列表(list)和元組(tupple)對象(必須要有count方法并且可以切分)。這是我們在做分頁時必須要牢記的;
b、上述代碼中:page_list = page1.object_list 這里的page_list就是我們向前端發送的每一頁要展示的數據;
有了上面a、b兩小點的常識,再來宏觀的理解django的分頁功能就很容易了。

2、前端代碼:

            <ul class="pagination">
                <li class="">   {% if second_list_obj.has_previous %}
               <a href="?id={{ id }}&page={{ second_list_obj.previous_page_number }}&hostlist_search_q={{ hostlist_search_q }}">上一頁</a>
                {% endif %}
                </li>
                    <li class=" "><span>第{{ second_list_obj.number }}頁 | 共{{ p.num_pages}}頁</span></li>
                <li class="">
                    {% if second_list_obj.has_next %}
                        <a href="?id={{ id }}&page={{ second_list_obj.next_page_number }}&hostlist_search_q={{ hostlist_search_q }}">下一頁</a>
                    {% endif %}
                </li>
            </ul>
<span style="color: #8c8c8c"> 總計{{ second_list_obj.paginator.count }}條數據,總計{{ second_list_obj.paginator.num_pages }}頁</span>

3、django分頁原理:后臺不給前端傳page參數時默認page=1,默認展示第一頁的內容。當在前端點擊下一頁或者上一頁(又或者選擇跳到第幾頁)的時候,前端給后臺發送GET請求傳遞page參數,例如:前端向后臺里傳遞的page=5,后臺會將整個data按照limit值切割成10份(上述代碼中limit=10,可自定義),將第五份的值返回給前端做展示。
注意:前端的分頁往往是假分頁,對后臺來說是一頁(只在一個url,前端分頁針對數據量較小的時候:1000條數據以內,這是因為要考慮到機器的性能和客戶訪問瀏覽器時的體驗);而上述的分頁方式實際是后臺來做的,每一頁都是不同的url,對于數據量大時是非常必要的。
友情提示:當數據量特別大時,可以在查詢mysql前面加個內存中間件:redis,如此能極大地優化查詢性能(這里就不深究性能優化的事啦!)。

二、搜索字符串
1、搜索字符串相對來就比較簡單了,我所說的搜索是針對后臺數據庫的搜索。使用django自帶的filter數據庫查詢器

2、直接上代碼:

        if Second_domain.objects.filter(item_info__icontains='qinshilin'):
            search_contents = Second_domain.objects.filter(item_info__icontains='qinshilin')
            print(search_contents)

item_info:你自定義的數據庫表中字段,也就是說你要查Second_domain表中的item_info列中的'qinshilin'字段;
__icontains:不區分大小寫的模糊匹配。很好理解,即可以匹配到qinshilin,qinshilin123,sea121QinShilin232等等......上述的代碼執行的結果,這些都是可以匹配到的,當然也支持中文的搜索,假如你要搜索'覃士林',也是能從數據庫中查到的

總結:記錄一些Django開發中常用的小功能,方便自己以后的查看,也是因為百度上都是你抄我的,我抄你的,抄來抄去都沒了一篇正確的技術文檔,也方便大家正在python學習中能通過一篇正確的文章更好的理解這些小的功能。

實現效果:


效果圖.png

轉載請注明:覃士林的技術文檔 http://www.lxweimin.com/p/a549c0280486

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容