Как добавить Paginator к результату поиска, используя django? - PullRequest
0 голосов
/ 30 октября 2019

привет, я хочу добавить Paginator на страницу результатов поиска, как это сделать?

мой код:

view.py:

def search(request):
if request.method == 'GET':
    query= request.GET.get('q')
    submitbutton= request.GET.get('submit')

    if query is not None:

        home_database= Homepage.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        pcprograms_database= PCprogram.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        androidapk_database= AndroidApks.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        androidgames_database= AndroidGames.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        antiruvs_database= Antivirus.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        systems_database= OpratingSystems.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))
        pcgames_database= PCgames.objects.filter(Q(name__icontains=query) | Q(app_contect__icontains=query) | Q(page_url__icontains=query) | Q(app_image__icontains=query))

        results= sorted(chain(home_database,pcprograms_database,androidapk_database,androidgames_database,antiruvs_database,systems_database,pcgames_database),key=attrgetter('name'))

        paginator = Paginator(results, 2) # Show 25 rows per page
        page = request.GET.get('page')
        results = paginator.get_page(page)

        context={'results': results,
                 'submitbutton': submitbutton}

        return render(request, 'html_file/enterface.html', context)

    else:
        return render(request, 'html_file/enterface.html')

else:
    return render(request, 'html_file/enterface.html')

html page:

     {% if submitbutton == 'Search' and request.GET.q != '' %}
 {% if results %}
 <h1> <small> Results for <b><i style="color:#337ab7">{{ request.GET.q }}</i></b></small> : </h1>
 <br/><br/>

 {% for result in results %}
 <label id="label_main_app"> <img style="margin-top:.3%;margin-left:.3%" id="img_main_app_first_screen" src="{{result.app_image.url}}" alt="no image found !" height="160" width="165" > {{result.name}} <br><br> <p id="p_size_first_page"> {{result.app_contect}} <br> <br> <a href="{{ result.page_url }}" type="button" class="btn btn-primary"><big> See More & Download </big>  </a> </p>
  </label>

 {% endfor %}

 <!–– here for moving to make new pages in search if nedded  ––>
 {% if results.has_other_pages %}
   <ul class="pagination">
     {% if results.has_previous %}
       <li><a href="?q={{ request.GET.q }}&submit=Search/search-page={{ results.previous_page_number }}">&laquo;</a></li>
     {% else %}
       <li class="disabled"><span>&laquo;</span></li>
     {% endif %}
     {% for i in results.paginator.page_range %}
       {% if results.number == i %}
         <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
       {% else %}
         <li><a href="?q={{ request.GET.q }}&submit=Search/search-page={{ i }}">{{ i }}</a></li>
       {% endif %}
     {% endfor %}
     {% if results.has_next %}
       <li><a href="?q={{ request.GET.q }}&submit=Search/search-page={{ results.next_page_number }}">&raquo;</a></li>
     {% else %}
       <li class="disabled"><span>&raquo;</span></li>
     {% endif %}
   </ul>
 {% endif %}


 {% endif %}

 {% endif %}

Я добавил Paginator для поиска результатов в django, хорошо? и я помещаю шоу 2 элемента на странице, и у меня есть 8 элементов на странице

, но когда я делаю поиск по веб-сайту, это показывает 2 элемента, хорошо

и показывает мне 4 страницы, на которые я могу перейтиэто, но когда я нажимаю на странице 2 или 3 или 4, это ничего не показывает, почему?

1 Ответ

0 голосов
/ 31 октября 2019

Django предоставляет класс Paginator для разбивки на страницы, проверьте документы здесь: Объекты-пагинаторы .

Итак, в вашем views.py после

results= list(chain(home_database,pcprograms_database,androidapk_database,androidgames_database,antiruvs_database,systems_database,pcgames_database))

Вы можете написать

paginator = Paginator(results, 25) # Show 25 rows per page
page = request.GET.get('page')
results = paginator.get_page(page)
context={'results': results,
             'submitbutton': submitbutton}
return render(request, 'html_file/enterface.html', context)

Следующий шаг в вашем HTML-файле:

{% if submitbutton == 'Search' and request.GET.q != '' %}
 {% if results %}
 <h1> <small> Results for {{ request.GET.q }} : </small></h1>
 <br/><br/>

 {% for result in results %}
 <label id="label_main_app"> <img style="margin-top:.3%;margin-left:.3%"  id="img_main_app_first_screen" src="{{result.app_image.url}}" alt="no image found !" height="160" width="165" > {{result.name}} <br><br> <p id="p_size_first_page"> {{result.app_contect}} <br> <br> <a href="{{ result.page_url }}" type="button" class="btn btn-primary"><big> See More & Download </big>  </a> </p>
  </label>
 {% endfor %}

 {% if results %}
 <div class="pagination">
  <span class="step-links">
    {% if results.has_previous %}
        <a href="?page=1">&laquo; first</a>
        <a href="?page={{ results.previous_page_number }}">previous</a>
    {% endif %}

    <span class="current">
        Page {{ results.number }} of {{ results.paginator.num_pages }}.
    </span>

    {% if results.has_next %}
        <a href="?page={{ results.next_page_number }}">next</a>
        <a href="?page={{ results.paginator.num_pages }}">last &raquo;</a>
    {% endif %}
    </span>
  </div>
  {% endif %}
 {% else %}
 <h3> No results for this search </h3>
 {% endif %}
 {% endif %}

Поскольку объединение нескольких наборов запросов вызывает проблемы с разбиением на страницы, я думаю, вы также должны отсортировать их по общему ключу,поэтому, основываясь на этом ответе SO Ответ на похожую проблему, вам, возможно, придется отсортировать все эти запросы. Поэтому вместо list(chain( попробуйте следующий код:

from operator import attrgetter
results = sorted(
    chain(home_database,pcprograms_database,androidapk_database, ..etc),
    key=attrgetter('common_key'))

Вы можете выбрать common_key, может быть, поле name в вашем случае?

...