在Django-CMS中集成Haystack,省略了具有视图限制的页面

时间:2015-02-02 19:46:52

标签: django django-haystack django-cms whoosh

我想将haystack与django-cms集成在一起制作搜索视图。我的CMS具有视图限制的页面(只有少数经过身份验证的用户可以访问某些页面)。

问题是:在进行搜索时,haystack会为我提供包含所有页面结果的列表,包括当前用户尚未查看权限的页面。

如何以过滤结果的方式集成Haystack,只显示当前用户有权访问的结果?如果这不可能,如何配置haystack让它只索引没有视图限制的页面?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

在我对这个问题的解决方案中,我使用aldryn_search来完成Haystack和django-cms的集成。 aldryn_search返回一个包含所有页面结果的列表,包括当前用户没有查看权限的页面。要解决此问题,我将继承自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。