Coverage for website/views/SearchView.py: 90%
21 statements
« prev ^ index » next coverage.py v7.5.0, created at 2025-09-13 15:29 -0300
« prev ^ index » next coverage.py v7.5.0, created at 2025-09-13 15:29 -0300
1from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
2from django.db.models import Q
3from django.shortcuts import render
5from website.forms.SearchForm import SearchForm
6from website.models.PostModel import Post
9def search_posts(request):
10 form = SearchForm(request.GET)
11 query = request.GET.get("query", "")
12 results = []
14 if query:
15 # Search in title, text, and author name
16 results = Post.objects.filter(
17 Q(title__icontains=query)
18 | Q(text__icontains=query)
19 | Q(author__author_name__icontains=query)
20 ).order_by("-published_date")
22 # Pagination
23 paginator = Paginator(results, 6) # Show 6 posts per page
24 page = request.GET.get("page")
26 try:
27 posts = paginator.page(page)
28 except PageNotAnInteger:
29 # If page is not an integer, deliver first page
30 posts = paginator.page(1)
31 except EmptyPage:
32 # If page is out of range, deliver last page of results
33 posts = paginator.page(paginator.num_pages)
35 context = {
36 "form": form,
37 "query": query,
38 "posts": posts,
39 "results_count": results.count() if query else 0,
40 }
42 return render(request, "search/search_results.html", context)