Как Вы, наверное, знаете поиск и Django - понятия весьма и весьма родные. Каких только приложений не написали для этих целей: и djapian, и и solango, и даже haystack. И это все хорошо, и замечательно, но что делать если нужен простой, совсем простой, поиск по сайту без использования дополнительных поисковых движков? Ответ прост: писать свой очередной велосипед. Что я с удовольствием и сделал!
Итак, знакомтесь: kikola.contrib.basicsearch - приложение для легковесного поиска по любым моделям в вашем проекте.
Для того, чтобы быстро и ясно понять, что оно умеет и как оно
работает, предлогаю следующую задачу: в проекте используются
стандартная джанговская модель FlatPage
и самописная SampleModel
.
Надо организовать поиск по им, причем так, чтобы результаты из
SampleModel
печатались раньше, чем результаты из
FlatPage
.
Решение:
- Добавляем
kikola.contrib.basicsearch
вINSTALLED_APPS
; - Настраиваем
SEARCH_MODELS
там же, вsettings
'ах:SEARCH_MODELS = { 'flatpages.FlatPage': { 'description': '{{ obj.content|truncatewords_html:20 }}', 'fields': ('title', 'content'), 'priority': 0, 'title': '{{ obj.title }}', }, 'sample.SampleModel': { 'description': '{{ obj.overview|truncatewords_html:20 }}', 'fields': ('name', 'slug', 'overview'), 'priority': 100, 'trigger': lambda obj: obj.is_active, }, }
- Добавляем
kikola.contrib.basicsearch.urls
вROOT_URLCONF
-модуль; - ???
- Profit!
Иными словами, сейчас запустив тестовый сервер проекта и зайдя на
127.0.0.1:8000/search/ перед нами будет страничка с поисковой формой в
которой мы сможем поискать и по всем FlatPage
, и по
только активным SampleModel
.
зы. Код SampleModel
:
from django.db import models from django.db.models import permalink from django.utils.translation import ugettext_lazy as _ class SampleModel(models.Model): name = models.CharField(_('name'), max_length=64) slug = models.CharField(_('slug'), max_length=64) overview = models.TextField(_('overview'), blank=True) is_active = models.BooleanField(_('actived'), blank=True, default=True) def __unicode__(self): return self.name def get_absolute_url(self): return ('sample_urlname', [self.slug]) get_absolute_url = permalink(get_absolute_url)