首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-Haystack -如何在django-comments中使用Haystack?

Django-Haystack -如何在django-comments中使用Haystack?
EN

Stack Overflow用户
提问于 2013-03-12 08:00:59
回答 2查看 152关注 0票数 1

我在和姜戈-干草堆作斗争。

我需要做一个索引,有文章和评论文章。我的疑问是,我如何才能把一个基于文档的索引的文章和评论。

如何在评论和文章中搜索关键字并输出包含该关键字的文章(文章评论、文章)?

有可能吗?

诚挚的问候,

EN

回答 2

Stack Overflow用户

发布于 2013-03-13 07:32:46

首先要做的是忘记SearchIndex必须与模型完全对应的概念。它只有一个来源。

最简单的方法是使用模板将注释添加到索引文档中。这假设您的Article模型是一个title字段:

代码语言:javascript
复制
class ArticleIndex(SearchIndex, indexes.Indexable):
    text = CharField(document=True, use_template=True)
    title = CharField(model_attr='title')

    def get_model(self):
        return Article

注意,关键字参数use_template设置为true。此参数的默认值为search/indexes/{app_label}/{model_name}_{field_name}.txt。在该模板中,只输出您想要索引内容。例如。

代码语言:javascript
复制
{{ object.title|safe }}

{{ object.body|safe }}

{% for comment in object.comments.all %}
{{ comment|safe }}
{% endfor %}

虽然我担心这里的特定反向关系名称可能是错误的,但这是您想要做的要点。再说一次,这是一种简单的方法来完成你明确陈述的内容。

票数 3
EN

Stack Overflow用户

发布于 2013-04-18 00:52:25

这是对我有效的方法:

models.py中,假设注释附加到Article,您需要一个返回附加注释的方法(没有简单的方法可以做到这一点):

代码语言:javascript
复制
class Article:
    def comments(self):
        ids = [self.id]
        ctype = ContentType.objects.get_for_model(Article)
        comments = Comment.objects.filter(content_type=ctype,
                                          object_pk__in=ids,
                                          is_removed=False)
        return comments

在您的search_indexes.py中,确保ArticleIndex具有use_template=True

代码语言:javascript
复制
from django.contrib.contenttypes.models import ContentType
from django.contrib.comments.models import Comment

class ArticleIndex(SearchIndex):
    text = CharField(use_template=True)

在索引模板中,例如templates/search/indexes/article_text.txt

代码语言:javascript
复制
{% for comment in object.comments.all %}
    {{ comment }}
{% endfor %}

现在,唯一剩下的问题是在添加或删除注释时更新特定的索引对象。这里我们使用信号:

在您的models.py中:

代码语言:javascript
复制
from django.dispatch import receiver
from haystack import site
from django.contrib.comments.signals import (comment_was_posted,
                                             comment_was_flagged)

@receiver(comment_was_posted)
def comment_posted(sender, **kwargs):
    site.get_index(Article).update_object(kwargs['comment'].content_object)


@receiver(comment_was_flagged)
def comment_flagged(sender, **kwargs):
    site.get_index(Article).update_object(kwargs['comment'].content_object)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15350899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档