我知道这个问题已经很老了,但我遇到了同样的问题,我有信息要分享。
懒惰阅读?跳转到解决方案。
说你有这个模型:
class School(models.Model):
city = models.CharField(max_length=50)
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=50, unique=True)
cover = models.ImageField(upload_to='images/school-covers/')
您可以看到 ImageField: 封面。
如果您想使用带有自动完成功能的 Haystack 索引 School 模型,您应该这样做:
class SchoolIndex(indexes.SearchIndex, indexes.Indexable):
name = indexes.EdgeNgramField(model_attr='name')
city = indexes.EdgeNgramField(model_attr='city')
slug = indexes.CharField(model_attr='slug')
def get_model(self):
return School
def index_queryset(self, using=None):
# Used when the entire index for model is updated.
return self.get_model().objects.all()
如您所见,我没有包含 ImageField,因为 ImageField 对象不是 indexes 包的一部分。
此代码 sn-ps 将使用 School 模型的 name 和 city 字段进行索引。然后在您的 AJAX 视图中,您将使用 SearchQuerySet 处理搜索:
def search_ecoles(request):
name = SearchQuerySet().autocomplete(name=request.POST.get('search_text',''))
city = SearchQuerySet().autocomplete(city=request.POST.get('search_text',''))
schools = name | city
return render(request, 'website/ajax_search.html', {'schools' : schools})
到目前为止,我可以像这样访问我的模板中的结果:
<ul>
{% for school in schools %}
<li>
<span id="name"><a href="/school/{{ school.slug }}/">{{ school.name }}</a></span>
<span id="city">City: {{ school.city }}</span>
</li>
{% endfor %}
</ul>
解决方案
但也许您想访问封面 ImageField。最简单也可能更简洁的方法就是使用 School 对象中的对象,如下所示:
<img src="{{ school.object.cover.url }}" />