【问题标题】:Django how to get haystack working with django-hvadDjango 如何让 haystack 使用 django-hvad
【发布时间】:2015-04-27 20:19:42
【问题描述】:

我正在开发一个需要实现搜索引擎的多语言应用程序,我选择了 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
        )
    )

大海捞针不知道怎么处理hvad翻译字段

【问题讨论】:

    标签: python django django-haystack django-hvad


    【解决方案1】:

    我将描述遇到类似问题时我做了什么。

    在您的索引定义中,为当前语言指定一个字段。如果您进行查询,Django-hvad 总是返回一个 '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。

    【讨论】:

    • 我是 hvad 的当前维护者。我不太了解 haystack,但从故事的角度来看,这看起来不错。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多