Wagtail / Django:查询过滤器,仅返回用户具有访问权限的页面?

问题描述 投票:0回答:1

我正在浏览http://docs.wagtail.io/en/v2.7.1/reference/pages/queryset_reference.html处的文档。

是否有过滤器仅返回用户有权访问的页面?我只能看到public()not_public()

我有一些页面的隐私设置为私有(特定组的用户可以访问)。并希望将它们从查询结果中排除。

python django wagtail
1个回答
0
投票

PageQuerySet中没有此类过滤器。但是,您可以创建自己的QuerySet来添加授权的过滤器并使用它。以下代码来自欢乐事件EventQuerySet,并基于PageQuerySet.public_qBaseViewRestriction.accept_request。它获得了所有可能适用的限制,排除了用户通过的限制,然后滤除了其余限制的页面。

from wagtail.core.query import PageQuerySet
from wagtail.core.models import Page, PageManager, PageViewRestriction

class MyQuerySet(PageQuerySet):
    def authorized_q(self, request):
        PASSWORD = PageViewRestriction.PASSWORD
        LOGIN    = PageViewRestriction.LOGIN
        GROUPS   = PageViewRestriction.GROUPS
        KEY      = PageViewRestriction.passed_view_restrictions_session_key

        restrictions = PageViewRestriction.objects.all()
        passed = request.session.get(KEY, [])
        if passed:
            restrictions = restrictions.exclude(id__in=passed,
                                                restriction_type=PASSWORD)
        if request.user.is_authenticated:
            restrictions = restrictions.exclude(restriction_type=LOGIN)
        if request.user.is_superuser:
            restrictions = restrictions.exclude(restriction_type=GROUPS)
        else:
            membership = request.user.groups.all()
            if membership:
                restrictions = restrictions.exclude(groups__in=membership,
                                                    restriction_type=GROUPS)
        q = models.Q()
        for restriction in restrictions:
            q &= ~self.descendant_of_q(restriction.page, inclusive=True)
        return q

    def authorized(self, request):
        self.request = request
        if request is None:
            return self
        else:
            return self.filter(self.authorized_q(request))

然后您可以将其设置为模型的默认QuerySet。

class MyPage(Page):
    objects = PageManager.from_queryset(MyQuerySet)()

然后过滤MyPage对象时,您可以说MyPage.objects.live().authorized(request).all()

希望有帮助。可能包含错误。

© www.soinside.com 2019 - 2024. All rights reserved.