from __future__ import annotations from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator from django.http import HttpRequest, HttpResponse from django.template.response import TemplateResponse from apps.blog.models import ArticlePage RESULTS_PER_PAGE = 12 MAX_QUERY_LENGTH = 200 def search(request: HttpRequest) -> HttpResponse: query = request.GET.get("q", "").strip()[:MAX_QUERY_LENGTH] results_page = None paginator = None if query: results = ( ArticlePage.objects.live() .public() .select_related("author", "category") .prefetch_related("tags__metadata") .search(query) ) paginator = Paginator(results, RESULTS_PER_PAGE) page_num = request.GET.get("page") try: results_page = paginator.page(page_num) except PageNotAnInteger: results_page = paginator.page(1) except EmptyPage: results_page = paginator.page(paginator.num_pages) return TemplateResponse( request, "blog/search_results.html", { "query": query, "results": results_page, "paginator": paginator, }, )