Я создал представление для функции поиска, но оно не работает. Он не фильтрует товары

Я создал функцию поиска для своего веб-сайта В views.py:

def search_view(request):
    query=request.GET.get("q")

    if query:
        products=Product.objects.filter(title__icontains=query,description__icontains=query).order_by("-date")
    else:
        products = Product.objects.none()

    context={
        "products":products,
        "query":query
    }
    return render(request, 'core/search.html',context)

Я создал шаблон для поиска товаров на своем сайте и в search.html


    <form action="{%  url 'core:search'  %}" method="GET" class="search-form">
      <input type="text" name="q" placeholder="Enter your product name..." class="search-input">
      <button type="submit" class="search-button">Search</button>
    </form>

Но функция поиска не работает. То есть она не находит товар из моей базы данных

Пожалуйста, скажите мне, что здесь не так?

Запрос, который вы здесь пишете, проверяет, присутствует ли текст и в заголовке, и в описании. Если вы хотите сопоставить элементы, в которых присутствует хотя бы один из них, вы можете использовать:

from django.db.models import Q


def search_view(request):
    query = request.GET.get('q')

    if query:
        products = Product.objects.filter(
            Q(title__icontains=query) | Q(description__icontains=query)
        ).order_by('-date')
    else:
        products = Product.objects.none()

    context = {'products': products, 'query': query}
    return render(request, 'core/search.html', context)

При этом совпадение подстрок - не лучший способ поиска: небольшая опечатка, другой порядок слов, синоним и т. д. - все это приведет к неудаче.

Usually when searching it is better to use search technology like such as Solr, Elasticsearch, Whoosh [GitHub], Xapian, etc.

На PostgreSQL можно также использовать __search lookup [Django-doc] и другие технологии поискового вектора, хотя это все равно будет не очень эффективно.

Вернуться на верх