当用户位于管理页面上时,Django自定义管理器将返回所有内容

时间:2019-02-13 18:00:47

标签: python django

我正在创建Django应用。这是一个文章应用程序。我有一个名为hidden的字段,并且当hidden为真并且用户不在管理员身份时,我想返回一个查询集没有文章面板。

管理页面->显示所有内容

常规搜索->仅在hidden = False时显示

我的“常规搜索”是我进行的自定义搜索。我正在使用django-filter过滤结果,我想自动过滤掉隐藏的文章。

我正在使用自定义管理器创建此

class ArticleManager(models.Manager):
    def get_queryset(self, request):
        if request.user.is_superuser:
            return super().get_queryset()
        return super().get_queryset().filter(hidden=False)

但是我只是遇到这个错误:

TypeError: get_queryset() missing 1 required positional argument: 'request'

2 个答案:

答案 0 :(得分:1)

通常不会有request实例传递给管理器方法。 但是您可以使用其get_queryset() method自定义管理员内部使用的查询集:

class ArticleAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(hidden=False)

请注意,此查询集也将用于编辑实例,因此您可以真正限制某些用户可以访问哪些对象。

答案 1 :(得分:1)

基于更新的问题:您不应重新定义 model 管理器的get_queryset函数签名以使用request参数。相反,您需要使用一个user参数创建一个新的管理器函数,该函数将仅返回所需的项目。然后,您将其用作过滤器的queryset

例如:

class ArticleManager(models.Manager):
    def get_visible_items(self, user):
        if user.is_superuser:
            return super().get_queryset()
        return super().get_queryset().filter(hidden=False)

# In your view:
user = request.user
artice_filter = ArticleFilter(queryset=Article.objects.get_visible_items(user))