如何在django admin中的changelist_view中过滤查询集?

时间:2010-04-11 22:08:24

标签: django django-admin django-queryset changelist

假设我有一个网站,用户可以通过管理面板添加条目。每个用户都有自己负责的类别(每个类别都有一个通过ForeingKey / ManyToManyField分配的编辑器)。

当用户添加条目时,我通过使用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)

这样我可以限制用户可以添加条目的类别,并且它可以完美运行。

现在棘手的部分:在条目更改列表/操作页面上,我只想显示属于当前用户类别的条目。我试着用这种方法做到这一点:

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

但是我收到了这个错误:

  

AttributeError:'function'对象没有属性'filter'

这很奇怪,因为我认为它应该是一个典型的QuerySet。基本上这样的方法是not well documented,挖掘大量的Django代码并不是我最喜欢的运动。

任何想法如何实现我的目标?

1 个答案:

答案 0 :(得分:14)

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以确保用户有权在单个对象编辑页面上编辑对象。有关详细信息,请参阅James Bennett的以下博客文章:

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