Как мне запрашивать только разбитые на страницы данные в 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>