Django почему поиск по названию не работает
у меня есть модель Product, хранящая в себе информацию о продукте, я хочу реализовать поиск по названию данного продукта, но почему-то у меня ничего не получается (выводится страница без постов), в чём может быть проблема?
views.py
def search(request):
search_query = request.GET.get('q')
if search_query:
paginator = Product.objects.filter(Q(title__icontains=search_query))
else:
paginator = Product.objects.all()
return page_object
html
<nav class="navbar-brand navbar-dark bg-dark">
<form action="{% url 'product_search' %}" method="get" class="form-inline" enctype="multipart/form-data">
<input name="q" class="form-control mr-sm-2" type="search" placeholder="Поиск" aria-label="Search"
required="">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Искать</button>
</form>
</nav>
Ответы (1 шт):
Автор решения: Aleksandr Fetisov
→ Ссылка
В коде вместо paginator нужно создать page_object, который возвращается из функции paginate_queryset и который вы должны использовать для отображения страницы.
Кроме того, в вашем коде не указан шаблон для отображения результатов поиска. + Нужно создать шаблон, который будет отображать результаты поиска.
views.py:
from django.core.paginator import Paginator
from django.shortcuts import render
from django.db.models import Q
from .models import Product
def search(request):
search_query = request.GET.get('q')
if search_query:
product_list = Product.objects.filter(Q(title__icontains=search_query))
else:
product_list = Product.objects.all()
paginator = Paginator(product_list, 10) # Пагинация: 10 элементов на странице
page_number = request.GET.get('page')
page_object = paginator.get_page(page_number)
return render(request, 'search_results.html', {'page_object': page_object, 'query': search_query})
search_results.html:
{% extends 'base.html' %}
{% block content %}
<h1>Результаты поиска</h1>
{% if query %}
<p>Результаты по запросу "{{ query }}":</p>
{% endif %}
<div class="row">
{% for product in page_object %}
<div class="col-sm-6 col-md-4">
<div class="card mb-3">
<img class="card-img-top" src="{{ product.image.url }}" alt="{{ product.title }}">
<div class="card-body">
<h5 class="card-title">{{ product.title }}</h5>
<p class="card-text">{{ product.description }}</p>
<a href="{% url 'product_detail' product.id %}" class="btn btn-primary">Подробнее</a>
</div>
</div>
</div>
{% empty %}
<p>По вашему запросу ничего не найдено.</p>
{% endfor %}
</div>
<div class="pagination">
<span class="step-links">
{% if page_object.has_previous %}
<a href="?page=1">« первая</a>
<a href="?page={{ page_object.previous_page_number }}">‹ предыдущая</a>
{% endif %}
<span class="current-page">
Страница {{ page_object.number }} из {{ page_object.paginator.num_pages }}.
</span>
{% if page_object.has_next %}
<a href="?page={{ page_object.next_page_number }}">следующая ›</a>
<a href="?page={{ page_object.paginator.num_pages }}">последняя »</a>
{% endif %}
</span>
</div>
{% endblock %}