2010-04-11 295 views
5

比方說,我有一個網站,用戶可以通過管理面板添加條目。每個用戶都有自己的類別(每個類別都有一個通過ForeingKey/ManyToManyField分配的編輯器)。如何在django admin的changelist_view中過濾queryset?

當用戶添加條目,我用EntryAdmin這樣限制了選擇:

class EntryAdmin(admin.ModelAdmin): 
    (...) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'category': 
      if request.user.is_superuser: 
       kwargs['queryset'] = Category.objects.all() 
      else: 
       kwargs['queryset'] = Category.objects.filter(editors=request.user) 
      return db_field.formfield(**kwargs) 
     return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

這樣我可以限制哪些用戶可以添加條目類別和它的作品完美。

現在棘手的部分:在條目changelist/action頁面上我只想顯示那些屬於當前用戶的類別的條目。我試圖做到這一點使用這種方法:

def changelist_view(self, request, extra_context=None): 
     if not request.user.is_superuser: 
      self.queryset = self.queryset.filter(editors=request.user) 

但我得到這個錯誤:

AttributeError: 'function' object has no attribute 'filter'

這是奇怪的,因爲我認爲這應該是一個典型的查詢集。基本上這樣的方法是not well documented和挖掘噸的Django代碼是不是我最喜歡的運動。

任何想法如何實現我的目標?

回答

12

querysetModelAdmin上的方法,它返回一個查詢集。您需要在EntryAdmin課上覆蓋它。

def queryset(self, request): 
    qs = super(EntryAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    else: 
     return qs.filter(editors=request.user) 

更改查詢集將限制列表視圖中顯示的條目。您還需要覆蓋has_change_permission以確保用戶有權編輯單個對象編輯頁面上的對象。見詹姆斯貝內特以下博客文章進一步的細節:

http://www.b-list.org/weblog/2008/dec/24/admin/

+0

的查詢集需要按類別進行過濾。但是,當用戶分配了多個類別時會出現問題。或者也許我錯過了一些東西。 – minder 2010-04-11 23:18:30