Почему prepare_priority()
"не работает"
A SearchIndex
используется для преобразования отдельных объектов данной модели в записи в индексе Whoosh.Я назову эти записи SearchResults
, так как они отображаются в оболочке.Теперь поля, которые вы определили в TicketIndex
, (конечно) присутствуют в SearchResults
для Tickets
:
>>> from haystack.query import SearchQuerySet
>>> q = SearchQuerySet()
>>> ticket0 = q.all()[0]
>>> type(ticket0)
<class 'haystack.models.SearchResult'>
>>> hasattr(ticket0, 'text') and hasattr(ticket0, 'title') and hasattr(ticket0, 'priority')
True
Это означает, что 'priority'
отображается дважды - один раз как независимыйполе и один раз как часть содержимого 'text'
.Независимое поле выполняет через процедуру prepare_X.Текстовое поле проходит через шаблон (где object
относится к исходному объекту модели, не словарь подготовленных данных).
>>> print ticket0.priority
critical
>>> print ticket0.text
OH NOES!!!!
1
There's a problem. Very problematic. Please fix at once.
Исправление
В моделях:
PRIORITIES = {1:'critical', 2:'high', 3:'normal', 4:'low'}
class Ticket(models.Model):
...
priority = models.IntegerField(choices=PRIORITIES.items())
Используйте автоматически предоставленные get_priority_display
в качестве model_attr
:
class TicketIndex(indexes.SearchIndex):
...
priority = indexes.CharField(model_attr='get_priority_display')
Используйте get_priority_display
в шаблоне:
{{ object.get_priority_display }}