我正在使用带有Wagtail的Django创建一个个人网站,属于不同组的用户可以访问某些页面。例如,家庭组可以看到我的假日照片,而同事组可以看到一些内部文档。
通过管理员设置权限访问权限非常简单。但是,我想在禁止页面的链接旁边显示一个锁。这将使用户非常清楚哪些链接可以跟踪,哪些链接不能。
有没有办法验证当前用户是否有权访问给定页面?
在摆弄了 Wagtail 的代码后,我发现权限是通过一个名为PageViewRestriction
的模型处理的(代码非常简洁明了(,该模型又继承了定义方法accept_request
BaseViewRestriction
。由于所引用的页面存储在模型中,因此唯一缺少的部分是请求访问的用户。
有了这个,我设法将一个非常简单的模板标签放在一起,该标签检查当前用户是否可以看到给定的页面。筛选器如下所示:
@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 %}
请注意,原则上一个页面可以指定多个不同的权限。例如,不同组的成员可以查看它。我假设当前用户属于这些组之一,或者页面未指定查看权限,则用户可以访问该页面。