admin應用的一個最主要的視圖是change_list,是ModelAdmin的一個名為changelist_view的函數。不過需要ModelAdmin的其他全域變數和成員函數來配合,最主要的設計變數和函數是主要有以下幾個:
變數:
ordering,list_display ,list_editable,change_list_template,actions等
函數:
get_changelist,get_changelist_form,get_paginator,queryset等
大家可以看看源檔案(/django/contrib/admin/options.py)
change_list視圖看起來像下面那樣:
這裡涉及到很多的知識面,一般預設的話對我們來說基本夠用了。但有時候還是比較不足之處,但具體怎麼做呢?在你的yourModelAdmin裡面,可以重載ModelAdmin的函數和變數。一些常用的就不說了,大家可能已經知道了,官方文檔也寫的比較詳細。主要講講actions,queryset:
1. actions。actions是一個list,它們在change_list裡面專門用來處理所選記錄的操作。admin應用中有預設的一個action,就是刪除。當然也可以自己添加action,怎麼做能?還是直接看代碼例子,比較清楚:
這個看上去應該很明白了吧,不需要說多少了。值得說明一下的是函數當中request,queryset。
request,應該很明白,每個django的view都有一個request,這個request實際上是從changelist_view視圖中傳遞過來的,而queryset是根據使用者選擇的記錄當中的一個queryset集合。介面的樣子是這樣的:
方便吧!不過這裡沒有刪除的action,不要誤會,因為在這個例子當中,刪除使用者是我不希望做的。所以我把刪除使用者的action屏蔽掉了。怎麼樣屏蔽這個action呢?主要有兩種方法,第一種就是在ModeAdmin裡面有個一個函數:get_actions,它返回一個actions的列表,在yourModelAdmin裡面重載一下。代碼如下:
這個應該很清楚了,先調用父類返回一個actions,然後在actions裡面找到刪除的action,刪除它,並返回刪除後的actions。
另一種方法是在你的admin.py裡面添加admin.site.disable_action('delete_selected')這句就可以完成。但這個有很大的問題,看這條語句就明白它是對整個site來說的,也就是說你在任何一個admin.py裡面加上這麼一句,整個網站的所有app應用當中都沒有刪除的action了,所以要想好了再選擇用哪種方式來做。
這裡值得一提的是:這個actions可以有很好的發展,在很多web應用系統當中,往往會遇到這樣一種情節,比如說:
yourModelAdmin的actions=['action1','action2'],業務的流程告訴你一部分的使用者只有具備action1,一部分的使用者只有具備action2,另外一部分的使用者都具備,還有一部分的使用者都不具備任何actions。這樣一來,每個使用者的actions的情況是不一樣的,但都不要緊,get_actions函數可以幫你搞定。看例子:
代碼不用解釋了吧,當然也有其他的方法,只要能實現就可以了。但我覺得這樣的寫法比較合適,不同習慣而已。在速度上可能也比較佔優優勢。畢竟父類執行get_actions函數時,資料的大小在執行速度上應該會有所不同。
2.queryset:
在WEB應用系統中,你很有可能會涉及資料許可權的問題。比方說:同樣大家都有添加資料的許可權,但要在chang_list裡面只能看到自己添加的記錄,其他人的記錄是不能夠被看到的。這樣情況就要靠queryset函數了。在預設的情況下,queryset返回的是整個Model記錄。重載它可以幫組解決:
def queryset(self,request) :
qs = youModel.objects.filter(.....)
return qs
這樣起到了安全作用,資料安全性。
如果你要在change_list裡面添加額外的資料,可以通過重載changelist_view視圖和自訂change_list.html的模板來做。大致的做法是
def changelist_view(self, request, extra_context=None):
extra_context = {'變數名':'值',..........}
return super(yourModelAdmin,self).changelist_view(request,extra_context)
自訂模板:
change_list_template = ‘admin/yourapp/change_list_custom.html’
在/yourProject/yourApp/templates/yourapp_name/目錄下建立一個名為change_list_custom.html檔案,但一些重要的資料對象名都要參考它自己的,畢竟從視圖傳入到模板的對象資料名是由視圖決定的。