Это то, что работает для меня:
В вашем models.py
, предполагая комментарии прикрепляются к Article
, вы хотите метод, который возвращает комментарии, присоединенные к нему (нет простого способа сделать это):
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
:
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:
{% for comment in object.comments.all %}
{{ comment }}
{% endfor %}
Теперь, единственная оставшаяся проблема заключается в обновлении, что конкретный объект индекса, когда комментарий был добавлен или удален. Здесь мы используем сигналы:
В вашем models.py:
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)
Это, видимо, больше не работает. В текущей версии haystack, >>> с сайта импорта сена, Traceback: ImportError: невозможно импортировать имя 'site' – shacker