2010-02-17 35 views

回答

6

我不知道我知道你想要做什麼,但如果是在你的心中是有內置的教師用戶略有不同工作的用戶管理頁面,那麼我相信你必須要延長UserAdmin,並覆蓋queryset方法。

class TeacherSpecificUserAdmin(UserAdmin): 
    def queryset(self, request): 
    if request.user.is_teacher(): 
     return Teacher.objects.filter(pk=request.user.pk) 
    return UserAdmin.queryset(self, request) 

這會照顧禁止教師進行編輯或刪除其他記錄的,因爲如果你在ModelAdmin代碼,change_viewdelete_view方法看使用查詢集從queryset方法返回去更改或刪除的對象。

需要再調整一次,因爲用於更改UserAdmin中的密碼的視圖不會使用與其他視圖相同的系統來更改對象。只需在您的新課程中覆蓋它:

... 
def user_change_password(self, request, id): 
    if request.user.is_teacher() and request.user.pk != int(id): 
    # PermissionDenied is in django.core.exceptions 
    raise PermissionDenied 
    return UserAdmin.user_change_password(self, request, id) 
... 

之後,您只需阻止教師添加新用戶或刪除他們自己的記錄。做,要麼使用默認​​,或通過重寫has_add_permissionhas_delete_permission方法。

看看ModelAdmin的源代碼,如果你想要更多的信息(在contrib/admin/options.py)。

+0

+1 Thanks Clement!我試圖瞭解user_change_password()。閱讀代碼真的很值得。 – Viet 2010-02-18 12:16:19

3

有可能是沒有辦法做到這一點的生成。

permission docs

權限每對象類型的全局設置,而不是每個特定對象實例。例如,它可以說「瑪麗可以修改的新聞故事,」但它不是目前可以說「瑪麗可以修改的新聞故事,但只有那些她創造自己」或者「瑪麗只能改變有一定的地位新聞報道,出版日期或ID。「後者的功能是Django開發人員目前正在討論的內容。

但是,顯然,object level permissions即將到來。

相關問題