В PageQuerySet такого фильтра нет. Однако вы можете создать свой собственный QuerySet, который добавляет авторизованный фильтр и использовать его. Следующий код взят из событий Joyous 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()
Надеюсь, что полезно Может содержать ошибки.