Skip to main content
 首页 » 编程设计

python之Django 如何让干草堆与 django-hvad 一起工作

2025年05月04日66bonelee

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