could you please support adding pagination to the below search function based view, I tried the below but it gives me all the results in one page also when I press on next it return me back to the empty search form page
This my function
def post_search(request):
form = SearchForm()
query = None
results = []
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query']
search_vector = SearchVector('title', weight='A') + \
SearchVector('body', weight='B')
search_query = SearchQuery(query)
results = Post.published.annotate(
search=search_vector,
rank=SearchRank(search_vector, search_query)
).filter(rank__gte=0.3).order_by('-rank')
paginator = Paginator(results, 2) # 3 posts in each page
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer deliver the first page
posts = paginator.page(1)
except EmptyPage:
# If page is out of range deliver last page of results
posts = paginator.page(paginator.num_pages)
return render(request,
'blog/post/search.html',
{'form': form,
'page': page,
'posts': posts,
'query': query,
'results': results})
And here is pagination.html file
<div class="pagination">
<span class="step-links">
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}">Previous</a>
{% endif %}
<span class="current">
Page {{ page.number }} of {{ page.paginator.num_pages }}.
</span>
{% if page.has_next %}
<a href="?page={{ page.next_page_number }}">Next</a>
{% endif %}
</span>
and I included it in the search.html file using the below
{% include "pagination.html" with page=posts %}
You have to use Django's Paginator
def post_search(request):
form = SearchForm()
query = None
results = []
if 'query' in request.GET:
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query']
search_vector = SearchVector('title', weight='A') + \
SearchVector('body', weight='B')
search_query = SearchQuery(query)
results = Post.published.annotate(
search=search_vector,
rank=SearchRank(search_vector, search_query)
).filter(rank__gte=0.1).order_by('-rank')
paginator = Paginator(results, 25) # Show 25 results per page.
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request,
'blog/post/search.html',
{'form': form,
'query': query,
'page_obj': page_obj})
You will also have to adjust your template as described in the linked documentation.
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments