Я хочу разбить на страницы некоторые результаты, полученные с помощью 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 становится пустым).
Итак, мои вопросы:
- как мне сохранить параметр q в URL
- как мне связать мою разбивку на страницы с запросом elasticsearch
Спасибо за ваше время, любая помощь будет принята с благодарностью. * 10 36 *