我正试图通过Privat pages和相关的PageViewRestriction
模型来管理对Wagtail管理员中某些PageModel
页面的访问,并将这篇文章作为参考:
class MyAdmin(ModelAdmin):
model = MyPage
[ ... ]
def get_queryset(self, request):
qs = super().get_queryset(request)
user = request.user
[ ... ]
elif user.is_client:
return qs.filter(
Q(view_restrictions__restriction_type='groups', view_restrictions__groups__in=user.groups.all())
)
return None
什么都没有返回,所以我检查了外壳:
qs = MyPage.objects.all()
qs.first().get_view_restrictions()
>>> <QuerySet [<PageViewRestriction: PageViewRestriction object (2)>]>
qs.first().get_view_restrictions().first().groups.all()
>>> <QuerySet [<Group: MyGroup>]>
因此设置了限制,但尝试与上面相同的查询会返回一个空的qs:
my_user.groups.all()
>>> <QuerySet [<Group: MyGroup>]
qs.filter(Q(view_restrictions__restriction_type='groups', view_restrictions__groups__in=my_user.groups.all()))
>>> <PageQuerySet []>
更让我困惑的是,MyPage
实例上的view_restrictions
字段为空,但get_view_restrictions
方法返回期望的对象。
qs.first().specific.view_restrictions.all()
>>> <QuerySet []>
qs.first().specific.get_view_restrictions()
>>> <QuerySet [<PageViewRestriction: PageViewRestriction object (2)>]>
有人能解释一下吗?
我从Wagtail方面得到了一些反馈,似乎是"有点棘手&;现在归档我想要的东西。view_restrictions
是空的,因为限制是在祖先页面上设置的,并向下传播到树中。
不过,有一个PR正在进行中,它解决了我的用例