2010-04-11 296 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