i'm working on multilingual application need implement search engine, opted haystack.
this model want index
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, # 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 ) )
i don't know in haystack how deal hvad translation fields
i describe did when faced similar problem.
in index definition, specify field current language. django-hvad returns 'language_code' field if query, example:
class postindex(indexes.searchindex, indexes.indexable): # field definitions here lan = indexes.charfield(model_attr='language_code') # rest of 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()
this way when haystack indexes posts, every language version separately , store along language code.
you have modify search form include lan field filter:
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
it can hidden input field, value taken request.language_code.