Как мне запрашивать только разбитые на страницы данные в django?

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

Моя разбивка на страницы в формате HTML

<ul class="pagination center" id="pagination" hx-swap-oob="true">
  {% if data.has_previous %}
  <li class="waves-effect">
    <a href="?page={{ data.previous_page_number }}"><i class="material-icons"><</i></a>
  </li>
  {% endif %} {% for page in data.paginator.page_range %} {% if page == data.number %}
  <li class="active purple lighten-2"><a href="?page={{ page }}">{{page}}</a></li>
  {% else %}
  <li class="waves-effect"><a href="?page={{ page }}">{{page}}</a></li>
  {% endif %} {% endfor %} {% if data.has_next %}
  <li class="waves-effect">
    <a href="?page={{data.next_page_number}}"><i class="material-icons">></i></a>
  </li>
  {% endif %}
</ul>
деленья деленья

функция разбивки на страницы и views.py когда я использую искусственный интеллект, он показывает мне, что нужно изменить html-код, но я не могу этого понять, и я потратил часы, чтобы найти что-то, что упоминает об этом очень хорошо, и не нашел ни одного

def paginate(data, request):
    paginator = Paginator(data, 10)
    page_number = request.GET.get('page')
    data = paginator.get_page(page_number)
    return data
деленья деленья

def submission_portal(request):
    data = DataEntry.objects.all()
    data = paginate(data=data, request=request)
    text_count = DataEntry.objects.filter(category='text').count()
    image_url_count = DataEntry.objects.filter(category='image_url').count()
    context = {
        'data': data,
        'text_count': text_count,
        'image_url_count': image_url_count
    }
    return render(request, 'submission_portal/submission_page.html', context=context)

# Read https://www.w3schools.com/django/django_queryset_filter.php

# Search Bar Handler
def form_search(request):
    if request.method == 'POST':
        data = DataEntry.objects.filter(content__contains=request.POST.get('search'))
        data = paginate(data=data, request=request)
        context = {
            'data': data
        }
        return render(request, 'submission_portal/components/pagination.html', context=context)
деленья деленья

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

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

def form_search(request):
    if request.method == 'POST':
        search_query = request.POST.get('search')
        data = DataEntry.objects.filter(content__contains=search_query)
        data = paginate(data=data, request=request)
        context = {
            'data': data,
            'search_query': search_query  # Pass the search query to the template
        }
        return render(request, 'submission_portal/components/pagination.html', context=context)

Затем обновите html-код разбивки на страницы, чтобы включить поисковый запрос в ссылки разбивки на страницы:

<ul class="pagination center" id="pagination" hx-swap-oob="true">
  {% if data.has_previous %}
  <li class="waves-effect">
    <a href="?page={{ data.previous_page_number }}&search={{ search_query }}"><i class="material-icons"><</i></a>
  </li>
  {% endif %} 
  
  {% for page in data.paginator.page_range %} 
    {% if page == data.number %}
    <li class="active purple lighten-2"><a href="?page={{ page }}&search={{ search_query }}">{{page}}</a></li>
    {% else %}
    <li class="waves-effect"><a href="?page={{ page }}&search={{ search_query }}">{{page}}</a></li>
    {% endif %} 
  {% endfor %} 
  
  {% if data.has_next %}
  <li class="waves-effect">
    <a href="?page={{data.next_page_number}}&search={{ search_query }}"><i class="material-icons">></i></a>
  </li>
  {% endif %}
</ul>

Если вы хотите также обработать поисковый запрос в представлении submission_portal (в случае, если пользователь отправляет поисковую форму с помощью запроса GET), вы можете изменить его следующим образом:

def submission_portal(request):
    search_query = request.GET.get('search', '')
    if search_query:
        data = DataEntry.objects.filter(content__contains=search_query)
    else:
        data = DataEntry.objects.all()
    
    data = paginate(data=data, request=request)
    text_count = DataEntry.objects.filter(category='text').count()
    image_url_count = DataEntry.objects.filter(category='image_url').count()
    context = {
        'data': data,
        'text_count': text_count,
        'image_url_count': image_url_count,
        'search_query': search_query  # Pass the search query to the template
    }
    return render(request, 'submission_portal/submission_page.html', context=context)

Наконец, чтобы отобразить поисковый запрос в url-адресе (что необходимо для корректной работы разбивки на страницы), вы должны использовать метод GET в своей поисковой форме:

<form method="get" action="{% url 'submission_portal' %}">
  <input type="text" name="search" placeholder="Search..." value="{{ search_query }}">
  <button type="submit">Search</button>
</form>
Вернуться на верх