docs: def search(request, template="search_results.html", extra_context=None):
      """
      Display search results. Takes an optional "contenttype" GET parameter
      in the form "app-name.ModelName" to limit search results to a single model.
      """
      query = request.GET.get("q", "")
      page = request.GET.get("page", 1)
      per_page = settings.SEARCH_PER_PAGE
      max_paging_links = settings.MAX_PAGING_LINKS
      try:
          parts = request.GET.get("type", "").split(".", 1)
          search_model = apps.get_model(*parts)
          search_model.objects.search  # Attribute check
      except (ValueError, TypeError, LookupError, AttributeError):
          search_model = Displayable
          search_type = _("Everything")
      else:
          search_type = search_model._meta.verbose_name_plural.capitalize()
      results = search_model.objects.search(query, for_user=request.user)
      paginated = paginate(results, page, per_page, max_paging_links)
      context = {"query": query, "results": paginated,
                 "search_type": search_type}
      context.update(extra_context or {})
      return TemplateResponse(request, template, context)