django-haystack - нет модуля с именем search_sites - PullRequest
0 голосов
/ 07 ноября 2011

Я загружаю django-haystack-1.1.0.tar.gz, распаковываю его, затем копирую каталог haystack, который находится в нем, в мой каталог apps и добавляю haystack в мой INSTALLED_APPS (также добавьте чушь, потому что я тоже копирую ), но когда я перезагружаю сервер, я получаю 500 внутренних ошибок. Затем я удаляю, для эксперимента, handle_registrations() из haystack.__init__ и сайт начинает работать, но когда я пытаюсь выполнить поиск по стогу сена, я получаю No fields were found in any search_indexes. Please correct this before attempting to search. В settings.py у меня также:

HAYSTACK_SITECONF = 'search_sites'  
HAYSTACK_SEARCH_ENGINE = 'whoosh'  
HAYSTACK_WHOOSH_PATH = os.path.join(PROJECT_ROOT, 'mysite_search_sites')

Затем я восстановил handle_registrations(), удалил стог сена из INSTALLED_APPS и перезапустил сервер, и теперь я получаю No module named search_sites.
Также import haystack и haystack.__version__ работает, но haystack.management.commands не работает.
Может ли кто-нибудь помочь мне с этим, пожалуйста?

EDIT
Мой след:

/lib/python2.7/django/core/handlers/base.py in get_response
                        response = callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/myproject/apps/djangobb_forum/util.py in wrapper
            output = function(request, *args, **kwargs)
 ...
▶ Local vars
/myproject/apps/djangobb_forum/util.py in wrapper
            result = func(request, *args, **kwargs)
 ...
▶ Local vars
/myproject/apps/djangobb_forum/views.py in search
                for post in posts:
 ...
▶ Local vars
/myproject/apps/haystack/query.py in _manual_iter
            if not self._fill_cache(current_position, current_position + ITERATOR_LOAD_PER_QUERY):
 ...
▶ Local vars
/myproject/apps/haystack/query.py in _fill_cache
        results = self.query.get_results()
 ...
▶ Local vars
/myproject/apps/haystack/backends/__init__.py in get_results
                self.run()
 ...
▶ Local vars
/myproject/apps/haystack/backends/__init__.py in run
        results = self.backend.search(final_query, **kwargs)
 ...
▶ Local vars
/myproject/apps/haystack/backends/__init__.py in wrapper
            return func(obj, query_string, *args, **kwargs)
 ...
▶ Local vars
/myproject/apps/haystack/backends/whoosh_backend.py in search
            self.setup()
 ...
▶ Local vars
/myproject/apps/haystack/backends/whoosh_backend.py in setup
        self.content_field_name, self.schema = self.build_schema(self.site.all_searchfields())
 ...
▶ Local vars
/myproject/apps/haystack/backends/whoosh_backend.py in build_schema
            raise SearchBackendError("No fields were found in any search_indexes. Please correct this before attempting to search.")
 ...
▶ Local vars

Ответы [ 2 ]

2 голосов
/ 04 сентября 2012

Вам необходимо создать search_sites.py в ur корневой каталог проекта dir в соответствии с ur settings.py и добавить

import haystack
haystack.autodiscover()

Это исправит ошибку "Нет модуля с именем search_sites" И это LatestDocs для конфигураций Джанго-Хейстек

2 голосов
/ 09 ноября 2011

По шагам установки, которые вы перечислили, звучит так, как будто вы пропустили несколько шагов.

Обязательно ознакомьтесь с инструкциями по настройке Haystack , чтобы обратить особое внимание на разделы Создание сайта поиска и Создание индексов.

Длинное и короткое - это то, что вам не хватает файла индексов. Haystack регистрирует кучу вещей из ваших индексов при первом включении, поэтому это объясняет, почему вы получаете ошибки от haystack.__init__

Добавьте файл с именем search_indexes.py в каталог вашего приложения. Этот файл содержит список индексов, которые вы хотите сгенерировать для разных моделей. Простой пример будет:

from haystack.indexes import *
from haystack import site
from myapp.models import MyModel

class MyModelIndex(SearchIndex):
    text = CharField(document=True, use_template=True)

    def prepare(self, obj):
        self.prepared_data = super(MyModelIndex, self).prepare(obj)
        self.prepared_data['text'] = obj.my_field

site.register(MyModel, MyModelIndex)

Это добавит поле произвольного текстового поиска под названием «текст» к вашему индексу. Когда вы ищете свободный текст без указанного поля, стог сена будет искать это поле по умолчанию. Свойство my_field из модели MyModel добавляется в это текстовое поле и становится доступным для поиска. Это может быть, например, название модели или какое-то подходящее текстовое поле. Пример немного наивный, но пока он поможет вам запустить и запустить что-то, а затем вы можете немного его прочитать и развернуть.

При вызове site.register этот индекс регистрируется в модели MyModel, поэтому стог сена может его обнаружить.

Вам также понадобится файл с именем search_sites.py (имя в соответствии с вашими настройками) в каталоге вашего проекта, чтобы указать на индексные файлы, которые вы только что создали. Добавление следующего позволит вам просматривать ваши приложения и автоматически обнаруживать все зарегистрированные вами индексы.

import haystack
haystack.autodiscover()
...