深入admin之chang_list

來源:互聯網
上載者:User

  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檔案,但一些重要的資料對象名都要參考它自己的,畢竟從視圖傳入到模板的對象資料名是由視圖決定的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.