Django pagination возвращает все данные после нажатия на любой номер страницы в результатах поиска - PullRequest
0 голосов
/ 31 мая 2019

Я разбил на страницы результаты поиска. Во-первых, набор запросов дает мне идеальный результат, но когда я нажимаю на любой номер страницы, он принимает ключ поиска как нулевой и получает все данные из базы данных. вот код

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)

вот мой шаблон

home.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.помогите мне решить эту проблему

1 Ответ

0 голосов
/ 31 мая 2019

универсальный ListView:

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>
...