我正在浏览http://docs.wagtail.io/en/v2.7.1/reference/pages/queryset_reference.html处的文档。
是否有过滤器仅返回用户有权访问的页面?我只能看到public()
和not_public()
。
我有一些页面的隐私设置为私有(特定组的用户可以访问)。并希望将它们从查询结果中排除。
PageQuerySet中没有此类过滤器。但是,您可以创建自己的QuerySet来添加授权的过滤器并使用它。以下代码来自欢乐事件EventQuerySet
,并基于PageQuerySet.public_q
和BaseViewRestriction.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()
希望有帮助。可能包含错误。