2011-07-04 38 views

回答

-2

Django管理是不適合非常細粒度的控制,使他們沒有自動變量設計,讓這種類型的控制。

如果你需要這種類型的控制你將不得不去你自己。您需要覆蓋默認的管理模板。您可能會想要使用權限系統來跟蹤允許用戶執行的操作。

記住定製的你正在做的水平。在某種程度上遠遠超出預期目的,管理應用程序的限制將比簡單地滾動您自己的更細粒度的CRUD系統更多的工作。

+5

可以,只要你真正閱讀本手冊達到非常高的水平細粒度控制。 – Shayne

9

我可能會遲到回答這個問題,但任何方式,在這裏不用。約翰在概念上是正確的,但我只是想這樣做,因爲我知道django admin是真正靈活的。

任何方式就是你藏在用戶模式表單字段的方法是:ModelAdmin類的

exclude屬性可以用來隱藏字段。

2:本應允許在模型空白。

3:default在模型字段上的屬性是一個優點,或者您可能會收到意想不到的錯誤。

我遇到的問題是,我用得到驗證錯誤。我看了一眼追溯,發現 的錯誤是因爲UserAdminfieldsets分組,默認permission字段設置有user_permission在你的sub-calassed模型admin中覆蓋這個。

get_form中使用exclude屬性,您可以在其中訪問request變量,並且可以根據用戶的權限或組對其進行動態設置。

代碼:

admin.py:

class MyUserAdmin(UserAdmin): 

    list_display = ("username","first_name", "last_name", "email","is_active","is_staff","last_login","date_joined") 

    ## Static overriding 
    fieldsets = (
     (None, {'fields': ('username', 'password')}), 
     (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), 
     (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 
            'groups')}), 
    (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 
    ) 


    def get_form(self, request, obj=None, **kwargs): 
     self.exclude = ("user_permissions") 
     ## Dynamically overriding 
     self.fieldsets[2][1]["fields"] = ('is_active', 'is_staff','is_superuser','groups') 
     form = super(MyUserAdmin,self).get_form(request, obj, **kwargs) 
     return form 
+1

我知道這是一個老問題,但是,這個線程安全嗎? 'self.exclude'是一個類屬性,所以你可以獲得不需要的結果。我想要走的路是重寫新的'get_fields','get_fieldsets'等方法。我對嗎? – argaen

+1

@argaen你是對的;在初始化後分配給'self.exclude'(或任何其他類屬性,如'fields','readonly_fields'等)是不安全的,因爲每個進程創建的每個'ModelAdmin'只有一個實例。動態更改顯示哪些字段*必須使用'get_fields()'和類似的方法來完成。 –

相關問題