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