假设我有一个网站,用户可以在其中通过管理面板添加条目。每个用户都有自己负责的类别(每个类别都有一个通过 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:“功能”对象没有属性“过滤器”
这很奇怪,因为我认为它应该是一个典型的QuerySet。基本上这样的方法没有很好的文档记录,挖掘大量的 Django 代码不是我最喜欢的运动。
有什么想法可以实现我的目标吗?