Простой поиск на Django

Полнотекстовый поиск конечно хорошо, но иногда нет необходимости в нем. Реализация  простого поиска, в django оказалась довольно тривиальной задачей. Дабы облегчить кому то поиск, того, на что у меня ушло несколько часов да и себе на памятку, опишу вкратце как реализовать простой поиск на Django.

Допустим у нас есть модель

class Patient(models.Model):
    """
    Модель описывающая пациентов клиники, реализована
    в виде отдельного приложения, так как будет являться одной из базовых моделей
    исходя из логики пронраммы
    """
    firstname = models.CharField(max_length=100, verbose_name="Имя", blank=False, null=True)
    lastname = models.CharField(max_length=300, verbose_name="Фамилия", blank=False, null=True)
    midle_name = models.CharField(max_length=300, verbose_name="Отчетство", blank=True, null=True)

Так как  для отображения списка я использую CBV, а именно ListView то и переопредеять мы будем именно его

class PatientListView(CompanyProtectionMixin, ListView):
    model = Patient
    paginate_by = 12
    template_name = 'patient/patient_list.html'
    context_object_name = 'patients'

    def get_queryset(self):
        result = super(PatientListView, self).get_queryset()

        query = self.request.GET.get('q')
        if query:
            query_list = query.split()
            result = result.filter(
                reduce(operator.and_,
                       (Q(firstname__icontains=q) for q in query_list)) |
                reduce(operator.and_,
                       (Q(lastname__icontains=q) for q in query_list))  |
                reduce(operator.and_,
                       (Q(midle_name__icontains=q) for q in query_list))
            )
        return result

Теперь нам осталось внести правки в наш шаблон. В начало таблицы я добавил,  форму поиска, которая содержит следующий код

            <form class="input-group" action="{% url 'patient_list' %}" method="get" accept-charset="utf-8">
                <input type="text" placeholder="Найти пациента по имени " class="input form-control" name="q">
                <span class="input-group-btn">
                        <button type="submit" class="btn btn btn-primary"> <i class="fa fa-search"></i> Поиск</button>
                </span>
            </form>

Для полноты также приведу содержимое файла urls.py

urlpatterns = [
    url(r'^$', PatientListView.as_view(), name='patient_list'),
]

На этом собственно и все, единственное,  во views.py в начало  __icontains  добавьте название ваших полей из модели.

Простой поиск на Django: 3 комментария

    1. admin Автор записи

      Вам надо импортировать его перед использованием. пропишите в начале файлу
      from functools import reduce

Добавить комментарий

Ваш e-mail не будет опубликован.