2013-03-12 2 views
1

Я борюсь с Django-Haystack.Django-Haystack - Как использовать Haystack с комментариями django?

Мне нужно сделать указатель, содержащий статьи и комментарии. Мое сомнение заключается в том, как я могу поместить в индекс на основе статей статьи и комментарии.

Как я могу искать ключевые слова в комментариях и статьях и выводить статью с этими ключевыми словами (комментарии к статье, статья)?

Возможно?

С наилучшими пожеланиями,

ответ

3

Первое, что нужно сделать, это забыть о том, что понятие SearchIndex должно точно соответствовать модели. Это только источник от одного.

Самый простой способ сделать это - добавить комментарии к индексированному документу с использованием шаблона. Это предположить вашу Article модели как title поля:

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 устанавливается истина. Значением по умолчанию для этого является search/indexes/{app_label}/{model_name}_{field_name}.txt. В этом шаблоне просто выводится контент, который вы хотите индексировать. Например.

{{ object.title|safe }} 

{{ object.body|safe }} 

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

Хотя я боюсь, что специфическое обратное имя отношений здесь, вероятно, неправильно, это суть того, что вы хотите сделать. Опять же, это простой способ выполнить то, что вы конкретно заявили.

0

Это то, что работает для меня:

В вашем 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) 
+0

Это, видимо, больше не работает. В текущей версии haystack, >>> с сайта импорта сена, Traceback: ImportError: невозможно импортировать имя 'site' – shacker

Смежные вопросы