上篇文章說(shuō)到了autocomplete light結(jié)合xadmin時(shí)可能遇到的一個(gè)bug,那么為什么需要在admin或者xadmin后臺(tái)增加autocomplete light呢旱幼?一定要用嗎?
Django2.0中新增了幾個(gè)feature宵蛀,大家比較關(guān)注的可能是以下幾個(gè):
url配置更加人性化,簡(jiǎn)單的規(guī)則不需要正則了县貌,比如path('articles//', views.year_archive)糖埋。
admin后臺(tái)新增響應(yīng)式設(shè)計(jì),可以在移動(dòng)端管理后臺(tái)了窃这。
新增Window表達(dá)式來(lái)支持queryset的OVER條件。(參考鏈接1征候,2杭攻。后面考慮寫一篇文章)
這三個(gè)也是django文檔上提到的主要特性。
今天這里說(shuō)另外一個(gè)小的特性疤坝,但是對(duì)于后臺(tái)開(kāi)發(fā)很有用兆解。那就是autocomplete fields[參考鏈接3]。
默認(rèn)外鍵展示的坑
拿新聞網(wǎng)站舉例跑揉,一篇文章肯定是屬于某個(gè)頻道的锅睛,這是一個(gè)外鍵。那么我在后臺(tái)新增文章時(shí)历谍,肯定需要選擇歸屬于那個(gè)頻道现拒。djangoadmin和xadmin的做法都是把外鍵數(shù)據(jù)全部加載出來(lái),渲染到select表中望侈。
當(dāng)外鍵的數(shù)據(jù)量小的時(shí)候印蔬,這不是個(gè)問(wèn)題,但是如果你的頻道有上千個(gè)呢脱衙?再多點(diǎn)呢侥猬?你可以想象下要等待多久才能拿到數(shù)據(jù)例驹,然后渲染完頁(yè)面。
因此我們一般使用autocomplete light來(lái)解決這個(gè)問(wèn)題退唠,解決問(wèn)題的思路其實(shí)很簡(jiǎn)單(視頻里講的很清楚)鹃锈,就是監(jiān)聽(tīng)input的change,然后發(fā)送數(shù)據(jù)到后端某個(gè)接口瞧预,接口根據(jù)輸入關(guān)鍵字來(lái)過(guò)濾數(shù)據(jù)(類似Model.objects.filter(name__contains=keywords))屎债,最后返回結(jié)果。前端展示松蒜。
不過(guò)每次都需要配置autocomplete light是有點(diǎn)繁瑣扔茅,上篇文章中也提到一個(gè)概念自治?,如果Django本身就能解決這個(gè)問(wèn)題秸苗,那肯定是極好的召娜。
admin的autocomplete_fields
在Django的2.0版本中,提供了這樣的功能惊楼,可以在admin配置中玖瘸,定義autocomplete_fields = ['外鍵字段']來(lái)解決上面說(shuō)到的問(wèn)題。(前端庫(kù)依然是select2.js)
不過(guò)單純的配置autcomplete_fields是不行的檀咙,后端得提供個(gè)接口才行雅倒。因此這個(gè)外鍵字段必須配置了admin才行(并且設(shè)置了search_fields配置)。像是這樣:
實(shí)現(xiàn)
Django本身的實(shí)現(xiàn)很簡(jiǎn)單弧可,比起我們?cè)黾油獠繋?kù)的配置蔑匣,Django自己直接在admin代碼中增加了autocomplete_view以及對(duì)應(yīng)的url,來(lái)支持這個(gè)邏輯棕诵。
具體源碼可以參考:?https://github.com/django/django/blob/master/django/contrib/admin/options.py#L582
參考
http://agiliq.com/blog/2017/12/django-20-window-expressions-tutorial/
https://docs.djangoproject.com/en/2.0/releases/2.0/#django-contrib-admin
- from the5fire.com?
文章轉(zhuǎn)自:https://www.the5fire.com/