Wagtail/Django:查询过滤器只返回用户拥有的页面/权限?



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

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

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

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))

然后,可以将其设置为模型的默认查询集。

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

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

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

相关内容

最新更新