简体   繁体   English

如何在 django 中为搜索视图添加分页,我尝试了以下方法

[英]How to add pagination to search view in django, I tried the below

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这是 pagination.html 文件

<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 我使用以下内容将其包含在 search.html 文件中
{% include "pagination.html" with page=posts %}

You have to use Django's Paginator你必须使用 Django 的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.您还必须按照链接文档中的说明调整模板。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM