18 апреля 2009 г.

Давайте просто поищем!

Как Вы, наверное, знаете поиск и Django - понятия весьма и весьма родные. Каких только приложений не написали для этих целей: и djapian, и и solango, и даже haystack. И это все хорошо, и замечательно, но что делать если нужен простой, совсем простой, поиск по сайту без использования дополнительных поисковых движков? Ответ прост: писать свой очередной велосипед. Что я с удовольствием и сделал!

Итак, знакомтесь: kikola.contrib.basicsearch - приложение для легковесного поиска по любым моделям в вашем проекте.

Для того, чтобы быстро и ясно понять, что оно умеет и как оно работает, предлогаю следующую задачу: в проекте используются стандартная джанговская модель FlatPage и самописная SampleModel. Надо организовать поиск по им, причем так, чтобы результаты из SampleModel печатались раньше, чем результаты из FlatPage.

Решение:

  1. Добавляем kikola.contrib.basicsearch в INSTALLED_APPS;
  2. Настраиваем 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,
       },
    }
    
  3. Добавляем kikola.contrib.basicsearch.urls в ROOT_URLCONF-модуль;
  4. ???
  5. 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)

blog comments powered by Disqus