Wagtail:如何验证用户是否可以访问模板中的页面

Wagtail: How to verify if a user can access a page in the template

我正在使用 Django 和 Wagtail 创建个人网站,其中属于不同组的用户可以访问某些页面。比如家人组可以看到我的假期照片,同事组可以看到一些内部文件。

通过管理员设置权限访问权限非常简单。但是,我想在 link 到 forbidden 页面旁边显示一个锁。这将使用户非常清楚哪些 links 可以被关注,哪些不能。

有什么方法可以验证当前用户是否有权访问给定页面?

在摆弄了 Wagtail 的代码后,我发现权限是通过一个名为 PageViewRestriction 的模型处理的(code 非常简洁明了),它又继承了 BaseViewRestriction 定义了一个方法 accept_request。由于引用的页面存储在模型中,唯一缺少的部分是用户请求访问。

有了这个,我设法组合了一个非常简单的模板标签,它检查当前用户是否可以看到给定的页面。过滤器看起来像这样:

@register.simple_tag(takes_context=True)
def can_view(context, page):
    pvrs = PageViewRestriction.objects.filter(page=page)
    request = context['request']
    if pvrs:
        for pvr in pvrs:
            if pvr.accept_request(request):
                return True
        return False
    return True

我在我的模板中使用的是这样的:

{% can_view menuitem as permission %}
  {% if not permission %}
    <i class="fas fa-lock"></i>
  {% endif %}

请注意,原则上一个页面可以指定多个不同的权限。例如,不同组的成员可以查看它。我假设如果当前用户属于这些组之一,或者如果页面未指定查看权限,则用户可以访问该页面。