2011-05-30 14 views
6

Tek bir django cms örneğinde, arama için (Solr ile) haystack içeren birden çok site kurdum. Ancak, sahip olduğum search_indexes.py'nin herhangi bir etkisi yok gibi görünüyor. Sadece göz ardı edilmiş ve varsayılan bir tanesi kullanılmış gibi. Neden search_indexes.py etkinleşiyor?django cms birden fazla siteyle mi arama yapıyorsunuz?

aşağıdaki var:

settings.py:

HAYSTACK_SITECONF = 'mysite.search_sites' 

search_sites.py:

from cms.models import monkeypatch_reverse 
import haystack 

monkeypatch_reverse() 
haystack.autodiscover() 

mysite/app/search_indexes.py:

from django.conf import settings 
from django.utils.translation import string_concat, ugettext_lazy 
from django.utils.html import strip_tags 

from haystack import indexes, site 

from cms.models.managers import PageManager 
from cms.models.pagemodel import Page 
from cms.models.pluginmodel import CMSPlugin 

def page_index_factory(lang, lang_name): 
    if isinstance(lang_name, basestring): 
     lang_name = ugettext_lazy(lang_name) 

    def get_absolute_url(self): 
     if 'cms.middleware.multilingual.MultilingualURLMiddleware' in settings.MIDDLEWARE_CLASSES: 
      return '/%s%s' % (lang, Page.get_absolute_url(self)) 
     else: 
      return Page.get_absolute_url(self) 

    class Meta: 
     proxy = True 
     app_label = 'cms' 
     if len(settings.LANGUAGES) > 1: 
      verbose_name = string_concat(Page._meta.verbose_name, ' (', lang_name, ')') 
      verbose_name_plural = string_concat(Page._meta.verbose_name_plural, ' (', lang_name, ')') 
     else: 
      verbose_name = Page._meta.verbose_name 
      verbose_name_plural = Page._meta.verbose_name_plural 

    attrs = {'__module__': Page.__module__, 
      'Meta': Meta, 
      'objects': PageManager(), 
      'get_absolute_url': get_absolute_url} 

    _PageProxy = type("Page_%s" % lang.title() , (Page,), attrs) 

    _PageProxy._meta.parent_attr = 'parent' 
    _PageProxy._meta.left_attr = 'lft' 
    _PageProxy._meta.right_attr = 'rght' 
    _PageProxy._meta.tree_id_attr = 'tree_id' 

    class _PageIndex(indexes.SearchIndex): 
     site_id = indexes.IntegerField(model_attr="site__id") 
     language = lang 
     text = indexes.CharField(document=True, use_template=False) 
     pub_date = indexes.DateTimeField(model_attr='publication_date') 
     login_required = indexes.BooleanField(model_attr='login_required') 
     url = indexes.CharField(stored=True, indexed=False, model_attr='get_absolute_url') 
     title = indexes.CharField(stored=True, indexed=False, model_attr='get_title') 

     def prepare(self, obj): 
      self.prepared_data = super(_PageIndex, self).prepare(obj) 
      plugins = CMSPlugin.objects.filter(language=lang, placeholder__in=obj.placeholders.all()) 
      text = '' 
      for plugin in plugins: 
       instance, _ = plugin.get_plugin_instance() 
       if hasattr(instance, 'search_fields'): 
        text += ''.join(strip_tags(getattr(instance, field, '')) for field in instance.search_fields) 
       if getattr(instance, 'search_fulltext', False): 
        text += strip_tags(instance.render_plugin()) 
      self.prepared_data['text'] = text 
      return self.prepared_data 

     def index_queryset(self): 
      qs = _PageProxy.objects.published().filter(title_set__language=lang).distinct() 
      if 'publisher' in settings.INSTALLED_APPS: 
       qs = qs.filter(publisher_is_draft=True) 
      return qs 

    return _PageProxy, _PageIndex 

for lang_tuple in settings.LANGUAGES: 
    lang, lang_name = lang_tuple 
    site.register(*page_index_factory(lang, lang_name)) 
+4

bir şekilde bu şekilde çözümünü eklemek Could Bunun yerine tüm eklentileri için endeksler kaydeder search_indexes dosyasını içe gerekiyor Bir düzenleme yapmak yerine cevap vermek mümkün mü? Bu şekilde insanlar cevaplandığını gördü ve Django soruları için "cevapsız" sekmesinde görünmüyor. :) – bouteillebleu

+0

O muhtemelen uzun bir süre önce gitti ve SO kaldı. Çözümünü çözüm kutusuna kopyalayıp yapıştırıyorum. Onu işaretleyeceğim ve çözümü kopyaladığımı ve sorunun onaylanmış olarak işaretleneceğini açıklayacağım. – Joe

cevap

0

Tamam, sorun arama ile oldu. autodiscover kullanmayan sites.py.

from cms.models import monkeypatch_reverse 
monkeypatch_reverse() 
import mysite.app.search_indexes 

Ve sonra aşağıdaki komut tüm siteler üzerinde endeksi çalışır:

import os 
import sys 

root = os.path.join(os.path.dirname(__file__), '..') 
sys.path.insert(0, root) 

activate_this = os.path.join(root, 'venv/bin/activate_this.py') 
execfile(activate_this, dict(__file__=activate_this)) 
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' 

from django.contrib.sites.models import Site 
from django.conf import settings 

from haystack.management.commands.clear_index import Command as clearCommand 
from haystack.management.commands.update_index import Command as updateCommand 

clear = clearCommand() 
clear.handle(interactive=False) 

for site in Site.objects.all(): 
    settings.SITE_ID = site.id 
    update = updateCommand() 
    update.handle() 
İlgili konular