【问题标题】:Django custom manager return everything when user is on admin page当用户在管理页面上时,Django 自定义管理器返回所有内容
【发布时间】:2019-02-13 18:00:46
【问题描述】:

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

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

普通搜索 -> 仅在 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'

【问题讨论】:

  • 错误信息说您需要将request 传递给get_queryset。查看文档:docs.djangoproject.com/en/2.1/ref/contrib/admin/…
  • 我该如何通过呢?我在管理页面上如何传递请求?
  • 那个错误告诉你你的get_queryset() 方法没有被request 参数调用。您不能在 Manager 中执行此操作。您应该在您的ModelAdmin 中执行此操作。它甚至是您所需要的 documented

标签: python django


【解决方案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))

【讨论】:

    【解决方案2】:

    通常不会将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)
    

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

    【讨论】:

    • 这行得通,但我想从我的正常搜索中隐藏隐藏的文章(我有一个自定义搜索)。
    • @Myzel394 您的常规/自定义搜索是什么?
    • @malberts 更新了问题。我的正常搜索只是对非管理员用户的自定义搜索。
    猜你喜欢
    • 2016-08-17
    • 2021-11-19
    • 2018-08-28
    • 2016-05-04
    • 1970-01-01
    • 2011-05-03
    • 2021-05-07
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多