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