上篇文章說到了autocomplete light結(jié)合xadmin時可能遇到的一個bug,那么為什么需要在admin或者xadmin后臺增加autocomplete light呢?一定要用嗎?
Django2.0中新增了幾個feature,大家比較關(guān)注的可能是以下幾個:
url配置更加人性化,簡單的規(guī)則不需要正則了,比如path('articles//', views.year_archive)。
admin后臺新增響應(yīng)式設(shè)計,可以在移動端管理后臺了。
新增Window表達(dá)式來支持queryset的OVER條件。(參考鏈接1,2。后面考慮寫一篇文章)
這三個也是django文檔上提到的主要特性。
今天這里說另外一個小的特性,但是對于后臺開發(fā)很有用。那就是autocomplete fields[參考鏈接3]。
默認(rèn)外鍵展示的坑
拿新聞網(wǎng)站舉例,一篇文章肯定是屬于某個頻道的,這是一個外鍵。那么我在后臺新增文章時,肯定需要選擇歸屬于那個頻道。djangoadmin和xadmin的做法都是把外鍵數(shù)據(jù)全部加載出來,渲染到select表中。
當(dāng)外鍵的數(shù)據(jù)量小的時候,這不是個問題,但是如果你的頻道有上千個呢?再多點呢?你可以想象下要等待多久才能拿到數(shù)據(jù),然后渲染完頁面。
因此我們一般使用autocomplete light來解決這個問題,解決問題的思路其實很簡單(視頻里講的很清楚),就是監(jiān)聽input的change,然后發(fā)送數(shù)據(jù)到后端某個接口,接口根據(jù)輸入關(guān)鍵字來過濾數(shù)據(jù)(類似Model.objects.filter(name__contains=keywords)),最后返回結(jié)果。前端展示。
不過每次都需要配置autocomplete light是有點繁瑣,上篇文章中也提到一個概念自治?,如果Django本身就能解決這個問題,那肯定是極好的。
admin的autocomplete_fields
在Django的2.0版本中,提供了這樣的功能,可以在admin配置中,定義autocomplete_fields = ['外鍵字段']來解決上面說到的問題。(前端庫依然是select2.js)
不過單純的配置autcomplete_fields是不行的,后端得提供個接口才行。因此這個外鍵字段必須配置了admin才行(并且設(shè)置了search_fields配置)。像是這樣:

實現(xiàn)
Django本身的實現(xiàn)很簡單,比起我們增加外部庫的配置,Django自己直接在admin代碼中增加了autocomplete_view以及對應(yīng)的url,來支持這個邏輯。
具體源碼可以參考:?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/
