📝 Django

Поиск в Django

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
81
🌳
Уровень
Продвинутый
🐦 💼 ✈️

Требует PostgreSQL и django.contrib.postgres в INSTALLED_APPS.

Простой поиск через icontains

def task_list(request):
    q = request.GET.get('q', '')
    tasks = Task.objects.filter(title__icontains=q) if q else Task.objects.all()
    return render(request, 'tasks/list.html', {'tasks': tasks, 'q': q})

Поиск по нескольким полям

from django.db.models import Q

def task_list(request):
    q = request.GET.get('q', '')
    if q:
        tasks = Task.objects.filter(
            Q(title__icontains=q) |
            Q(description__icontains=q) |
            Q(owner__username__icontains=q)
        )
    else:
        tasks = Task.objects.all()
    return render(request, 'tasks/list.html', {'tasks': tasks, 'q': q})

Форма поиска в шаблоне

<form method="get" action="{% url 'task-list' %}">
  <input type="text" name="q" value="{{ q }}" placeholder="Поиск задач...">
  <button type="submit">Найти</button>
</form>

В ListView

class TaskListView(ListView):
    model = Task
    template_name = 'tasks/list.html'

    def get_queryset(self):
        qs = super().get_queryset()
        q = self.request.GET.get('q')
        if q:
            qs = qs.filter(
                Q(title__icontains=q) | Q(description__icontains=q)
            )
        return qs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['q'] = self.request.GET.get('q', '')
        return context

Полнотекстовый поиск (PostgreSQL)

from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank

vector = SearchVector('title', weight='A') + SearchVector('description', weight='B')
query = SearchQuery(q)
tasks = Task.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.1).order_by('-rank')

Требует PostgreSQL и django.contrib.postgres в INSTALLED_APPS.

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 131
📝

Django: Теги шаблонов

Теги шаблонов — это логика внутри HTML. В отличие от {{ переменная }}, которая только...

📅 30.06.2026 👁️ 81
📝

Django: Статические файлы

Статические файлы — CSS, JavaScript, изображения, шрифты. Django обрабатывает их особым образом: в разработке раздаёт...

📅 30.06.2026 👁️ 71

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!