Добрый день,
Изучаю django, пилю блог. решил добавить поиск. Использую haystack + elasticsearch.
Вроде бы все сделал по документации, но все равно не получается реализовать. В самом низу есть ссылка на исходники. Я уверен, что проблема тривиальна и я ее не вижу из-за не опытности.
При заходе на страницу search.html ввожу в поле часть названия статьи выводит сообщение что результатов нет.
Единственное что я заметил необычного, это что при обновлении индексов выводит сообщение что ничего не обновилось и ругается на тайм зону.
python manage.py update_index
/home/oleg/.virtualenvs/test/lib/python3.4/site-packages/django/db/models/fields/__init__.py:1278: RuntimeWarning: DateTimeField Post.datetime received a naive datetime (2015-08-04 10:35:48.135647) while time zone support is active.
RuntimeWarning)
Indexing 0 posts
Но если я убираю строку из search_indexes.py
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.filter(datetime=datetime.datetime.now())
то обновление идексов происходит
python manage.py update_index
Indexing 5 posts
но даже при индексации, все равно поиск не происходит.
вот исходники:
models.py
class Post(models.Model):
title = models.CharField(max_length=255) # title of post
datetime = models.DateTimeField(u'Дата публикации') # date of post
content = models.TextField(max_length=10000) # text of post
background_image = models.ImageField(upload_to="pics/", verbose_name=u"Your image", help_text="150x150", null=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return '%i/' % self.id
views.py
class MySearchView(SearchView):
template_name = "blog/search.html"
def get_queryset(self):
queryset = super(MySearchView, self).get_queryset()
return queryset.filter(pub_date__gte=date(2015, 1, 1))
def get_context_data(self, *args, **kwargs):
context = super(MySearchView, self).get_context_data(*args, **kwargs)
return context
search_indexes.py
from haystack import indexes
from .models import Post
import datetime
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
content = indexes.CharField(model_attr='content')
def get_model(self):
return Post
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.filter(datetime=datetime.datetime.now())
search.html
<form type="get" action=".">
<input type="text" name="q">
<button type="submit">Search</button>
</form>
{% if query %}
{% for post in posts %}
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
{% empty %}
<p>No results found.</p>
{% endfor %}
{% endif %}
utls.py
urlpatterns = patterns('',
url(r'^search/?$', MySearchView.as_view(), name='search'),
)
древо файлов в проекте:
├── blog
│ ├── images
│ ├── templates
│ │ ├── blog
│ │ │ ├── base.html
│ │ │ ├── post_detail.html
│ │ │ ├── post_list.html
│ │ │ └── search.html
│ │ ├── __init__.py
│ │ └── search
│ │ └── indexes
│ │ └── blog
│ │ └── post_text.txt
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── search_indexes.py
│ ├── admin.py
│ ├── forms.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
│ ├── urls.py
│ └── views.py
├── db.sqlite3
├── manage.py
├── media
├── mysiteblog
└── static
Вот ссылка на сами исходники, дабы было проще понять.
https://drive.google.com/file/d/0B4Taa_ekRbyAWEJtc...