Я создал представление для функции поиска, но оно не работает. Он не фильтрует товары
Я создал функцию поиска для своего веб-сайта В 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] и другие технологии поискового вектора, хотя это все равно будет не очень эффективно.