django cms 搜索多个站点?
我已经在 django cms 的单个实例中设置了多个站点,并使用 haystack 进行搜索(使用 Solr)。但是,我得到的 search_indexes.py 似乎没有任何效果。就像它被忽略并使用默认值一样。为什么我的search_indexes.py没有生效?
我有以下内容:
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))
I've set up multiple sites within a single instance of django cms with haystack for search (with Solr). However, the search_indexes.py that I've got doesn't appear to have any effect. It's like it's just ignored and a default one is used. Why isn't my search_indexes.py taking effect?
I've got the following:
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))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,问题出在 search_sites.py 上,它不应该使用自动发现。相反,它需要导入 search_indexes 文件,该文件将为所有插件注册索引:
然后以下脚本在所有站点上运行索引:
OK, so the problem was with the search_sites.py which shouldn't use autodiscover. Instead it needs to import the search_indexes file which will register indexes for all plugins:
And then the following script runs the index over all sites: