2010-06-01 60 views
1

我使用Django的管理員讓用戶管理特定模型的模型實例。 每個用戶應該只能管理他的模型實例。 (應管理所有的管理員除外)。基於用戶的模型實例在Django過濾admin

如何過濾admin的更改列表視圖中的對象?

思考:

  • 我想最優雅的方法是使用Object-level permissions。任何人都知道這個的實現?
  • 是否可以通過使用ModelAdmin.changelist_view覆蓋管理員的視圖來完成?
  • list_select_related與它有什麼關係?

回答

7

您可以覆蓋管理員的queryset - 方法只顯示用戶的項目:

def queryset(self, request): 
     user = getattr(request, 'user', None) 
     qs = super(MyAdmin, self).queryset(request) 
     if user.is_superuser: 
      return qs 
     return qs.filter(user=user) 

除此之外,您還應該注意有關has_change_permissionhas_delete_permission - 方法,如像:

def has_delete_permission(self, request, obj=None): 
     if not request.user == obj.user and not request.user.is_superuser: 
      return False 
     return super(MyAdmin, self).has_delete_permission(request, obj) 

has_change_permission相同! list_select_related只有在獲取管理員的查詢集時才能立即獲取關係數據,而不是在需要時才使用!

如果您的主要目標只是限制用戶無法與其他對象一起工作,那麼上述接觸將會起作用,如果它變得越來越複雜並且您無法簡單地通過ONE屬性(如用戶)看看django的行級權限提案!

+1

你的代碼的第一次和平工作很好。我也在這裏找到它: http://www.ibm.com/developerworks/opensource/library/os-django-admin/index.html – Jonathan 2010-06-02 20:28:43