Сохраните предыдущий параметр get в URL-адресе и разбейте его на страницы с помощью запроса от elasticsearch-dsl - PullRequest
0 голосов
/ 13 июля 2020

Я хочу разбить на страницы некоторые результаты, полученные с помощью elasticsearch-dsl (версия 7.8.0), точно так же, как переполнение стека делает с количеством вопросов на странице в его списке вопросов (см. { ссылка } . Итак, я ожидаю, что пользователь введет количество «сообщений» на странице, которое он хочет.

documents.py :

from django_elasticsearch_dsl import Document
from django_elasticsearch_dsl.registries import registry
from polls.models import Choice

@registry.register_document
class ChoiceDocument(Document):
    class Index:
        name = 'choices'
        settings = {
            'number_of_shards': 1,
            'number_of_replicas': 0,
        }

    class Django:
        model = Choice
        fields = ['choice_text']

from django.utils.functional import LazyObject

class SearchResults(LazyObject):
   def __init__(self, search_object):
      self._wrapped = search_object

   def __len__(self):
      return self._wrapped.count()

   def __getitem__(self, index):
      search_results = self._wrapped[index]
      if isinstance(index, slice):
         search_results = list(search_results)
      return search_results

просмотров. py :

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

# search is the name of my app
from search.documents import ChoiceDocument, SearchResults

def search_choice(request):
    paginate_by = request.GET.get("paginate_by", 2) or 2

    all_choices = ChoiceDocuments.search()

    q = request.GET.get("q", None)
    choices = ChoiceDocument.search().query("match", choice_text=q) if q else ''

    paginator = Paginator(SearchResults(choices), paginate_by) if choices else Paginator(SearchResults(all_choices), paginate_by)
    page_number = request.GET.get("page")

    try:
        page = paginator.page(page_number)
    except PageNotAnInteger:
        page = paginator.page(1)
    except EmptyPage:
        page = paginator.page(paginator.num_pages)

    page_obj = paginator.get_page(page_number)

    return render(request, 'search/search.html', {'choices': choices, 'page_obj': page_obj}

поиск. html шаблон:

{% load template_tags %}

<form method="get">
    <input id="q" type="text" placeholder="your search...">
    
    <label for="paginate_by">Number of options per page:</label>
    <select name="paginate_by" id="paginate_by">
       <option value="2">2</option>
       <option value="3">3</option>
       <option value="5">5</option>
    </select>

    {# is this where I should put this template tag? #}
    <a href="{{request.path}}/?{% query_transform paginate_by=request.GET.paginate_by %}"<input type="submit" value="Paginate"></a>
</form>

<div class="col-sm-10>
   {% block pagination %}
      <div class="pagination">
         <span class="step-links">
            {% if page_obj.has_previous %}
               <a href="{{request.path}}?page={{page_obj.previous_page_number}}">previous</a>
            {% endif %}
         <span class="page-current">Page {{page_obj.number}} of {{page_obj.paginator.num_pages}}.</span>
         {% if page_obj.has_next %}
               <a href="{{request.path}}?page={{page_obj.next_page_number}}">next</a>
         {% endif %}
         </span>
      </div>
   {% endblock %}
</div>

Вот мой template_tags.py :

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def query_transform(context, **kwargs):
    query = context['request'].GET.copy()
    for k, v in kwargs.items():
        query[k] = v

    return query.urlencode()

Поиск действительно работает, и я получаю правильные результаты, но когда я нажимаю кнопку Paginate, ничего не происходит. URL-адрес изменяется с say / searchchoices /? Q = searchtext & paginate_by = 2 на / searchchoices /? q = & paginate_by = 2 (как вы можете видеть, параметр q становится пустым).

Итак, мои вопросы:

  1. как мне сохранить параметр q в URL
  2. как мне связать мою разбивку на страницы с запросом elasticsearch

Спасибо за ваше время, любая помощь будет принята с благодарностью. * 10 36 *

...