Как Вы, наверное, знаете поиск и 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)