前言:在百度上查找django分頁(yè)功能非常之多替裆,但可用的技術(shù)文檔寥寥無(wú)幾校辩。分頁(yè)雖說(shuō)只是我們開發(fā)項(xiàng)目中一個(gè)很小的功能,但實(shí)現(xiàn)它是十分必要且必須的辆童。因?yàn)閷?shí)現(xiàn)分頁(yè)功能兵迅,能使我們更加清楚明了地查看頁(yè)面信息浓若。
一、django分頁(yè)功能的實(shí)現(xiàn)(使用django封裝的pagination分頁(yè)器)
話不多說(shuō),直接上代碼友题,再對(duì)代碼作清楚的解析(我想各位看官就明白是咋回事了)
1、后臺(tái)代碼:
limit = 10
p = Paginator(data, limit) # 實(shí)例化一個(gè)分頁(yè)對(duì)象
page = request.GET.get('page') # 獲取頁(yè)碼
# print('我是page------------',page)
# print('我是id------------',primary_domain_id)
if page:
pass
else:
page = 1
try:
a_a = p.page(page) # 獲取某頁(yè)對(duì)應(yīng)的記錄
page1 = p.page(page)
page_list = page1.object_list
except PageNotAnInteger: # 如果頁(yè)碼不是個(gè)整數(shù)
a_a = p.page(1) # 取第一頁(yè)的記錄
except EmptyPage: # 如果頁(yè)碼太大彩届,沒(méi)有相應(yīng)的記錄
a_a = p.page(p.num_pages) # 取最后一頁(yè)的記錄
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) # 實(shí)例化一個(gè)分頁(yè)對(duì)象,data可以是從數(shù)據(jù)庫(kù)表(django的models實(shí)例化的<class Query>對(duì)象)怠缸,也可以是python原生的列表(list)和元組(tupple)對(duì)象(必須要有count方法并且可以切分)诗轻。這是我們?cè)谧龇猪?yè)時(shí)必須要牢記的;
b揭北、上述代碼中:page_list = page1.object_list 這里的page_list就是我們向前端發(fā)送的每一頁(yè)要展示的數(shù)據(jù)扳炬;
有了上面a吏颖、b兩小點(diǎn)的常識(shí),再來(lái)宏觀的理解django的分頁(yè)功能就很容易了恨樟。
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 }}">上一頁(yè)</a>
{% endif %}
</li>
<li class=" "><span>第{{ second_list_obj.number }}頁(yè) | 共{{ p.num_pages}}頁(yè)</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 }}">下一頁(yè)</a>
{% endif %}
</li>
</ul>
<span style="color: #8c8c8c"> 總計(jì){{ second_list_obj.paginator.count }}條數(shù)據(jù),總計(jì){{ second_list_obj.paginator.num_pages }}頁(yè)</span>
3、django分頁(yè)原理:后臺(tái)不給前端傳page參數(shù)時(shí)默認(rèn)page=1劝术,默認(rèn)展示第一頁(yè)的內(nèi)容缩多。當(dāng)在前端點(diǎn)擊下一頁(yè)或者上一頁(yè)(又或者選擇跳到第幾頁(yè))的時(shí)候,前端給后臺(tái)發(fā)送GET請(qǐng)求傳遞page參數(shù)养晋,例如:前端向后臺(tái)里傳遞的page=5衬吆,后臺(tái)會(huì)將整個(gè)data按照l(shuí)imit值切割成10份(上述代碼中l(wèi)imit=10,可自定義)匙握,將第五份的值返回給前端做展示咆槽。
注意:前端的分頁(yè)往往是假分頁(yè),對(duì)后臺(tái)來(lái)說(shuō)是一頁(yè)(只在一個(gè)url圈纺,前端分頁(yè)針對(duì)數(shù)據(jù)量較小的時(shí)候:1000條數(shù)據(jù)以內(nèi)秦忿,這是因?yàn)橐紤]到機(jī)器的性能和客戶訪問(wèn)瀏覽器時(shí)的體驗(yàn));而上述的分頁(yè)方式實(shí)際是后臺(tái)來(lái)做的蛾娶,每一頁(yè)都是不同的url灯谣,對(duì)于數(shù)據(jù)量大時(shí)是非常必要的。
友情提示:當(dāng)數(shù)據(jù)量特別大時(shí)蛔琅,可以在查詢mysql前面加個(gè)內(nèi)存中間件:redis胎许,如此能極大地優(yōu)化查詢性能(這里就不深究性能優(yōu)化的事啦!)罗售。
二辜窑、搜索字符串
1、搜索字符串相對(duì)來(lái)就比較簡(jiǎn)單了寨躁,我所說(shuō)的搜索是針對(duì)后臺(tái)數(shù)據(jù)庫(kù)的搜索穆碎。使用django自帶的filter數(shù)據(jù)庫(kù)查詢器
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:你自定義的數(shù)據(jù)庫(kù)表中字段职恳,也就是說(shuō)你要查Second_domain表中的item_info列中的'qinshilin'字段所禀;
__icontains:不區(qū)分大小寫的模糊匹配。很好理解放钦,即可以匹配到qinshilin色徘,qinshilin123,sea121QinShilin232等等......上述的代碼執(zhí)行的結(jié)果操禀,這些都是可以匹配到的褂策,當(dāng)然也支持中文的搜索,假如你要搜索'覃士林',也是能從數(shù)據(jù)庫(kù)中查到的
總結(jié):記錄一些Django開發(fā)中常用的小功能斤寂,方便自己以后的查看蔑水,也是因?yàn)榘俣壬隙际悄愠业模页愕难锶铮瓉?lái)抄去都沒(méi)了一篇正確的技術(shù)文檔,也方便大家正在python學(xué)習(xí)中能通過(guò)一篇正確的文章更好的理解這些小的功能丹擎。
實(shí)現(xiàn)效果:
轉(zhuǎn)載請(qǐng)注明:覃士林的技術(shù)文檔 http://www.reibang.com/p/a549c0280486