Django 如何让干草堆与 django-hvad 一起工作
Django how to get haystack working with django-hvad
我正在开发一个需要实现搜索引擎的多语言应用程序,我选择了 haystack。
这是我要索引的模型
class Post(TranslatableModel):
category = models.ForeignKey(
Category,
related_name='posts',
verbose_name=_(u'Categoría')
)
slug = AutoSlugField(
populate_from='title'
)
featured_picture = ThumbnailerImageField(
upload_to='blog/posts/featured-pictures',
verbose_name=_(u'Imagen destacada'),
help_text=_(u'Tamaño: 850 x 423px. Será recordada si no.')
)
box_bg = models.CharField(
max_length=20,
verbose_name=_(u'Color de fondo de la caja'),
choices=SERVICE_BOX_COLORS,
# Could be an image
null=True, blank=True
)
box_image_bg = ThumbnailerImageField(
upload_to='blog/posts/background-images',
verbose_name=_(u'Imagen de fondo de la caja'),
null=True, blank=True,
help_text=_(u'Tamaño: 500 x 500px. Será recordada si no.')
)
translations = TranslatedFields(
title=models.CharField(
max_length=100,
verbose_name=_(u'Título')
),
content=RichTextField(
verbose_name=_(u'Contenido')
),
meta_description=models.TextField(
verbose_name=_(u'Meta description (SEO)'),
help_text=_(u'Máximo 160 caracteres.'),
max_length=160
)
)
我不知道在haystack中如何处理hvad翻译字段
我将描述我遇到类似问题时所做的事情。
在您的索引定义中,为当前语言指定一个字段。如果您进行查询,Django-hvad 总是 returns 一个 'language_code' 字段,例如:
class PostIndex(indexes.SearchIndex, indexes.Indexable):
# your field definitions here
lan = indexes.CharField(model_attr='language_code')
# rest of your configuration here
def index_queryset(self, using=None):
return self.get_model().objects.language('all').all()
def read_queryset(self, using=None):
return self.get_model().objects.language()
这样当 Haystack 索引帖子时,它会分别获取每个语言版本并将其与语言代码一起存储。
您必须修改搜索表单以将 lan 字段作为过滤器包括在内:
class PostSearchForm(SearchForm):
lan = forms.CharField(required=False)
def search(self):
sqs = super(PostSearchForm, self).search()
if not self.is_valid():
return self.no_query_found()
if self.cleaned_data.get('lan'):
sqs = sqs.filter(lan=self.cleaned_data['lan'])
return sqs
可以是隐藏输入框,取值自request.LANGUAGE_CODE。
我正在开发一个需要实现搜索引擎的多语言应用程序,我选择了 haystack。
这是我要索引的模型
class Post(TranslatableModel):
category = models.ForeignKey(
Category,
related_name='posts',
verbose_name=_(u'Categoría')
)
slug = AutoSlugField(
populate_from='title'
)
featured_picture = ThumbnailerImageField(
upload_to='blog/posts/featured-pictures',
verbose_name=_(u'Imagen destacada'),
help_text=_(u'Tamaño: 850 x 423px. Será recordada si no.')
)
box_bg = models.CharField(
max_length=20,
verbose_name=_(u'Color de fondo de la caja'),
choices=SERVICE_BOX_COLORS,
# Could be an image
null=True, blank=True
)
box_image_bg = ThumbnailerImageField(
upload_to='blog/posts/background-images',
verbose_name=_(u'Imagen de fondo de la caja'),
null=True, blank=True,
help_text=_(u'Tamaño: 500 x 500px. Será recordada si no.')
)
translations = TranslatedFields(
title=models.CharField(
max_length=100,
verbose_name=_(u'Título')
),
content=RichTextField(
verbose_name=_(u'Contenido')
),
meta_description=models.TextField(
verbose_name=_(u'Meta description (SEO)'),
help_text=_(u'Máximo 160 caracteres.'),
max_length=160
)
)
我不知道在haystack中如何处理hvad翻译字段
我将描述我遇到类似问题时所做的事情。
在您的索引定义中,为当前语言指定一个字段。如果您进行查询,Django-hvad 总是 returns 一个 'language_code' 字段,例如:
class PostIndex(indexes.SearchIndex, indexes.Indexable):
# your field definitions here
lan = indexes.CharField(model_attr='language_code')
# rest of your configuration here
def index_queryset(self, using=None):
return self.get_model().objects.language('all').all()
def read_queryset(self, using=None):
return self.get_model().objects.language()
这样当 Haystack 索引帖子时,它会分别获取每个语言版本并将其与语言代码一起存储。
您必须修改搜索表单以将 lan 字段作为过滤器包括在内:
class PostSearchForm(SearchForm):
lan = forms.CharField(required=False)
def search(self):
sqs = super(PostSearchForm, self).search()
if not self.is_valid():
return self.no_query_found()
if self.cleaned_data.get('lan'):
sqs = sqs.filter(lan=self.cleaned_data['lan'])
return sqs
可以是隐藏输入框,取值自request.LANGUAGE_CODE。