Полнотекстовый поиск конечно хорошо, но иногда нет необходимости в нем. Реализация простого поиска, в 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 добавьте название ваших полей из модели.
спасибо, то что нужно.
Почему то не разрешает использовать operator.and_