Как реализовать собственный фильтр поиска - Django?
У меня есть модель Book:
class Book(models.Model):
title = models.CharField()
...
HTML-форма:
<form type="get" action=".">
<input id="search_box" type="text" name="search_box" placeholder="Search..." >
<button type="submit" >Submit</button>
</form>
Например: Пользователь вводит в форму некоторый текст: "Какой-то странный текст". Я хочу найти все книги, которые содержат хотя бы одно из этих слов в верхнем или нижнем регистре или некоторые фразы в этом тексте('Some', 'some', 'Strange', 'strange', 'text', 'text' или 'some strange', 'Strange text' и так далее). Как я могу это сделать?
Вы можете разделить поисковый запрос, чтобы получить слова, а затем сопоставить их с названием книги. Мы можем сделать это, построив объект Q
[Django-doc], который будет представлять условие фильтрации:
from django.db.models import Q
query = request.GET.get('search_box')
books = Book.objects.all()
if query:
query = query.split()
q_obj = Q(
*[Q(('title__icontains', item)) for item in query],
_connector=Q.OR
)
books = Book.objects.filter(q_obj)
Если поле поиска заполнено, оно отфильтрует набор запросов books
таким образом, чтобы в нем было хотя бы одно слово из запроса.