在 Django-CMS 中集成 Haystack 省略带有查看限制的页面
Integrating Haystack in Django-CMS omitting Pages with View-Restrictions
我想将 haystack 与 django-cms 集成,制作一个搜索视图。我的 CMS 的页面具有查看限制(只有少数经过身份验证的用户可以访问某些页面)。
问题是:在进行搜索时,haystack 向我列出了所有页面的结果,包括当前用户没有查看权限的页面。
如何以过滤结果的方式集成 Haystack,仅显示当前用户有权访问的结果?如果那不可能,如何配置 haystack 让它只索引没有查看限制的页面?感谢您的帮助。
在我对这个问题的解决方案中,我使用aldryn_search 来集成Haystack 和django-cms。 aldryn_search returns 包含所有页面结果的列表,包括当前用户没有查看权限的页面。为了解决这个问题,我从 AldrynSearchView 继承并覆盖 get_queryset 方法,如下所示:
def get_queryset(self):
queryset = super(IntranetSearchView, self).get_queryset()
for result in queryset.load_all():
page = result.object.page
# Begin: modified copy (queryset.exclude added) of cms.utils.decorators.cms_perms
if page:
if page.login_required and not self.request.user.is_authenticated():
queryset = queryset.exclude(id=result.id)
if not page.has_view_permission(self.request, user=self.request.user):
queryset = queryset.exclude(id=result.id)
# End: Copy
return queryset
使用 queryset.exclude() 排除当前用户没有权限的结果。之后,我从 AldrynSearchApphook 继承,用我的新视图覆盖 url,而不是对修改后的 Apphook 进行 apphoook_pool.register。
我想将 haystack 与 django-cms 集成,制作一个搜索视图。我的 CMS 的页面具有查看限制(只有少数经过身份验证的用户可以访问某些页面)。
问题是:在进行搜索时,haystack 向我列出了所有页面的结果,包括当前用户没有查看权限的页面。
如何以过滤结果的方式集成 Haystack,仅显示当前用户有权访问的结果?如果那不可能,如何配置 haystack 让它只索引没有查看限制的页面?感谢您的帮助。
在我对这个问题的解决方案中,我使用aldryn_search 来集成Haystack 和django-cms。 aldryn_search returns 包含所有页面结果的列表,包括当前用户没有查看权限的页面。为了解决这个问题,我从 AldrynSearchView 继承并覆盖 get_queryset 方法,如下所示:
def get_queryset(self):
queryset = super(IntranetSearchView, self).get_queryset()
for result in queryset.load_all():
page = result.object.page
# Begin: modified copy (queryset.exclude added) of cms.utils.decorators.cms_perms
if page:
if page.login_required and not self.request.user.is_authenticated():
queryset = queryset.exclude(id=result.id)
if not page.has_view_permission(self.request, user=self.request.user):
queryset = queryset.exclude(id=result.id)
# End: Copy
return queryset
使用 queryset.exclude() 排除当前用户没有权限的结果。之后,我从 AldrynSearchApphook 继承,用我的新视图覆盖 url,而不是对修改后的 Apphook 进行 apphoook_pool.register。