gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:24:59 24 4
gpt4 key购买 nike

假设我有一个网站,用户可以在其中通过管理面板添加条目。每个用户都有自己负责的类别(每个类别都有一个通过 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' object has no attribute 'filter'



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

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

最佳答案

警告:此答案来自 2010 年,对 Django >= 1.8 没有用。
querysetModelAdmin 上的一个方法它返回一个查询集。您需要在您的 EntryAdmin 上覆盖它类(class)。

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

更改查询集将限制 ListView 中显示的条目。您还需要覆盖 has_change_permission确保用户有权在单个对象编辑页面上编辑对象。有关详细信息,请参阅 James Bennett 的以下博客文章:

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

关于django - 如何在 django admin 中的 changelist_view 中过滤查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com