python 如何从Wagtail的搜索功能中排除一个或多个页面子类?

pgx2nnw8  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(82)

我正在为一个朋友创建一个博客网站,有一些特定的页面模型,我想从用户的搜索中排除。这些型号是BlogIndexPageThankYouPage。这两个模型都是wagtail.models.Page的子类。我想控制这些页面的访问方式,因此不希望它们的链接出现在搜索结果中,如果用户搜索例如 thankblog
对于上下文,这是search视图函数:

def search(request):
    search_query = request.GET.get("query", None)
    page = request.GET.get("page", 1)

    # Search
    if search_query:
        search_results = (
            Page.objects.live().order_by("-first_published_at").search(search_query)
        )
        query = Query.get(search_query)

        # Record hit
        query.add_hit()
    else:
        search_results = Page.objects.none()

    # etc...

字符串
我已经尝试了本文other thread中建议的两种解决方案和文档中的第三种解决方案,但它们都没有解决我的问题。具体来说,我尝试了以下方法:

class ThankYouPage(Page):
    ...

    # Method One:
    @classmethod
    def get_indexed_objects(cls):
        return cls.objects.none()

    # Method Two:
    def get_indexed_instance(self):
        return None

    # Method Three:
    search_fields = []


我在每次更改后都运行update_index管理命令。
在Django shell中,我得到以下行为:

>>> from wagtail.models import Page
>>> from apps.contact.models import ThankYouPage
>>>
>>> Page.objects.all().search("thank")
<SearchResults [<Page: Thank You Page>]>
>>>
>>> ThankYouPage.objects.all().search("thank")
<SearchResults []>
>>>


问题似乎是.search()方法返回Page示例的类似列表的对象,而不是特定的子类示例。我可以通过在搜索查询集中添加一个.exclude()方法来解决这个问题:

excluded_page_ids = [
    4,   # BlogIndexPage
    26,  # ThankYouPage
]

def search(request):
    search_query = request.GET.get("query", None)
    page = request.GET.get("page", 1)

    # Search
    if search_query:
        search_results = (
            Page.objects.live()
            .exclude(id__in=excluded_page_ids)  # Manually exclude certain pages
            .order_by("-first_published_at")
            .search(search_query)
        )
        query = Query.get(search_query)

        # Record hit
        query.add_hit()
    else:
        search_results = Page.objects.none()

    # etc...


但这感觉就像是一种不可持续的不良做法。有没有一个更pythonic或wagtailian的方式来做到这一点?

kdfy810k

kdfy810k1#

在搜索结果中不希望出现的页面子类中设置search_fields =[]。https://docs.wagtail.org/en/latest/topics/search/indexing.html#disabling-model-indexing

相关问题