Skip to content

WagtailBackendSearchHandler ordering error with a Page descendant model #22

@roodie

Description

@roodie

Issue Summary

Due to some client requirement, I had to add a ModelAdmin for one of our custom Page types to our Wagtail-based site.

The class itself is very simple:

class NewsPage(Page):
    subtitle = models.CharField(max_length=200, blank=True, null=True)
    body = StreamField(CONTENT_STREAMFIELD_ELEMENTS, blank=True, null=True)
    author = models.CharField(max_length=200, blank=True, null=True)
    date = models.DateField(verbose_name="Display date", blank=True, null=True)
    is_sticky = models.BooleanField(default=False)
    is_on_index = models.BooleanField(default=False)

The date, is_sticky and is_on_index fields are added to she search_fields as filters.

The ModelAdmin page is similarly simple:

class NewsAdmin(ModelAdmin):
    model = NewsPage
    list_display = ('title', 'url_path', 'date', 'first_published_at', 'is_sticky', 'is_on_index', 'live')
    list_filter = (('date', DateRangeFilter), 'is_sticky', 'is_on_index', 'live')
    search_handler_class = WagtailBackendSearchHandler

The search itself works properly; however, if I click on any of the field headers to sort a queryset, I get the following error:

wagtail.search.backends.base.OrderByFieldError: Cannot sort search results with field "page_ptr". Please add index.FilterField('page_ptr') to NewsPage.search_fields.

It doesn't matter if I try to order by a specific NewsPage field, or ny the default Page.title for example.

Full strace:

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\admin\urls\__init__.py" in wrapper
  105.             return view_func(request, *args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\admin\auth.py" in decorated_view
  165.                     return view_func(request, *args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\contrib\modeladmin\options.py" in index_view
  341.         return view_class.as_view(**kwargs)(request)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\views\generic\base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\utils\decorators.py" in _wrapper
  45.         return bound_method(*args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\contrib\modeladmin\views.py" in dispatch
  254.         self.queryset = self.get_queryset(request)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\contrib\modeladmin\views.py" in get_queryset
  525.         return self.get_search_results(request, qs, self.query)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\contrib\modeladmin\views.py" in get_search_results
  272.         return self.search_handler.search_queryset(queryset, search_term, **kwargs)

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\contrib\modeladmin\helpers\search.py" in search_queryset
  71.             order_by_relevance=not preserve_order,

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\search\backends\base.py" in search
  370.             partial_match=partial_match,

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\search\backends\base.py" in _search
  358.         search_query.check()

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\search\backends\base.py" in check
  161.         list(self._get_order_by())

File "C:\virtualenv\virtualenv_wagtail\lib\site-packages\wagtail\search\backends\base.py" in _get_order_by
  137.                     field_name=field_name

Exception Type: OrderByFieldError at /admin/content/newspage/
Exception Value: Cannot sort search results with field "page_ptr". Please add index.FilterField('page_ptr') to NewsPage.search_fields.

Technical details

Python version: Python 3.6.8
Django version: 2.2.6
Wagtail version: 2..7
Search backend: Postgres (from contrib)

Metadata

Metadata

Assignees

No one assigned

    Labels

    type:BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions