Wagtail:如何在ModelAdmin中使用view_restrictions来过滤查询集



我正试图通过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正在进行中,它解决了我的用例

最新更新