【问题标题】:Django pagination returns all data after clicking any page number in search result单击搜索结果中的任何页码后,Django 分页返回所有数据
【发布时间】:2019-10-17 00:30:22
【问题描述】:

我对搜索结果进行了分页。首先,查询集给了我完美的结果,但是当我点击任何页码时,它接受搜索键为空并从数据库中获取所有数据。这是代码

Views.py

def youtube_search(request):

    query = request.GET.get('q')
    Q = SearchDetail.objects.all().filter(query = query).order_by('-datetime')

    if request.method=='GET':
        page_request_var = 'page'
        page = request.GET.get(page_request_var)
        paginator = Paginator(Q, 10)
        try:
            paginated_queryset = paginator.page(page)
        except PageNotAnInteger:
            paginated_queryset = paginator.page(1)
        except EmptyPage:
            paginated_queryset =     paginator.page(paginator.num_pages)

    context = {
        'queryset': paginated_queryset,
        'page_request_var': page_request_var,
        'searchKey':query
        }

    return render(request, 'home.html', context)

这是我的模板

主页.html

<!DOCTYPE html>
<html>
<body>
    <header>
        <h3 class="h6">Search the blog</h3>
    </header>
    <form action="{% url 'search' %}" class="search-form">
        <div class="form-group">
        <input type="text" name="q" placeholder="What are you looking for?">
        <button type="submit">search</button>
        </div>
    </form>

{% for Q in queryset %}

    {{Q.title}}<br/>
    {{Q.description}}<br/>
    {{Q.datetime}}<br/>
    {{Q.thumbnail}}<br/>

{% endfor %}

<nav aria-label="Page navigation example">
          <ul class="pagination pagination-template d-flex justify-content-center">
            {% if queryset.has_previous %}                
            <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.previous_page_number }}" class="page-link"> <i class="fa fa-angle-left"></i></a></li>
            {% endif %}

                  {% for num in queryset.paginator.page_range %}

                        {% if queryset.number == num %}
                         <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.number }}" class="page-link active">{{ num }}</a></li>                       

                        {% elif num > queryset.number|add:'-3' and num < queryset.number|add:'3' %}

                        <li class="page-item"><a href="?{{ page_request_var }}={{ num }}" class="page-link ">{{ num }}</a></li>

                        {% endif %}

                  {% endfor %}
            {% if queryset.has_next %}
            <li class="page-item"><a href="?{{ page_request_var }}={{ queryset.next_page_number }}" class="page-link"> <i class="fa fa-angle-right"></i></a></li>
            {% endif %}

          </ul>
        </nav>

我在 stackoverflow 中搜索了解决方案。他们都没有回答我的问题 我尝试了从 google 获得的每一段代码。帮我解决这个问题

【问题讨论】:

  • 你可以使用通用的ListView。带有内置分页,ListView
  • 你能告诉我如何使用 ListView.please

标签: python html django search pagination


【解决方案1】:

通用列表视图:

from django.views.generic import ListView

class YoutubeSearchView(ListView):
    template_name = 'home.html'
    model = SearchDetail
    paginate_by = 10
    context_object_name = 'search_objects'

    def get_queryset(self):
        query = self.request.GET.get('q', None)
        if query:
            return SearchDetail.objects.filter(query__icontains=query).order_by('-datetime')
        return SearchDetail.objects.none()

    def get_context_data(self, **kwargs):
        context = super(YoutubeSearchView, self).get_context_data(**kwargs)
        context['searchKey'] = self.request.GET.get('q')
        return context

home.html:

{% load mathfilters %}
<!DOCTYPE html>
<html>
<body>
    <header>
        <h3 class="h6">Search the blog</h3>
    </header>
    <form action="{% url 'search' %}" class="search-form">
        <div class="form-group">
        <input type="text" name="q" placeholder="What are you looking for?">
        <button type="submit">search</button>
        </div>
    </form>

{% for Q in search_objects %}
    {{Q.title}}<br/>
    {{Q.description}}<br/>
    {{Q.datetime}}<br/>
    {{Q.thumbnail}}<br/>
{% endfor %}

<nav aria-label="Page navigation example">
    <ul class="pagination pagination-template d-flex justify-content-center">
        {% if page_obj.has_previous %}
            <li class="page-item">
                <a href="?page={{ page_obj.previous_page_number }}" class="page-link">
                    <i class="fa fa-angle-left"></i>
                </a>
            </li>
        {% endif %}
            {% for num in page_obj.paginator.page_range %}
                {% if page_obj.number == num %}
                    <li class="page-item">
                        <a href="?page={{ page_obj.number }}" class="page-link active">
                            {{ num }}
                        </a>
                    </li>
                {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
                <li class="page-item">
                    <a href="?page={{ num }}" class="page-link ">
                        {{ num }}
                    </a>
                </li>
            {% endif %}
        {% endfor %}
        {% if page_obj.has_next %}
            <li class="page-item">
                <a href="?page={{ page_obj.next_page_number }}" class="page-link">
                    <i class="fa fa-angle-right"></i>
                </a>
            </li>
        {% endif %}
    </ul>
</nav>

【讨论】:

  • 仍然,当我单击第 2 页时,它会返回所有数据库对象,而不是返回搜索查询的第二页
  • 发布第二页网址。
  • http://localhost:8000/?page=2 是第二页网址,http://localhost:8000/?q=django 是第一页。
  • 在您的模板中将此用于has_next 部分:page={{ page_obj.next_page_number }}&amp;q={{ searchKey }}
  • 大于200小于500
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2021-10-03
  • 2015-11-07
相关资源
最近更新 更多