第一次翻官方文档,确实比看别人写的博客管用多了,看博客说重载extra_context(),然后写了继承调用不出来,博客里面说什么降低haystack版本就可以继承出来,我都觉得这不是开玩笑吗,个人认为高版本代码跑起来总比低版本代码效率高吧,所以不要去降什么库不至于朋友们,还是要尝试下翻官方文档。
https://django-haystack.readthedocs.io/en/master/
'''
官方文档代码
重载context: get_context_data()
所有检索结果: self.queryset
# do something
'''
# views.py
from datetime import date
from haystack.generic_views import SearchView
class MySearchView(SearchView):
"""My custom search view."""
def get_queryset(self):
queryset = super(MySearchView, self).get_queryset()
# further filter queryset based on some set of criteria
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)
# do something
return context
# urls.py
urlpatterns = [
url(r'^/search/?$', MySearchView.as_view(), name='search_view'),
]
首先要清楚context里面都有什么(翻代码)
'''
检索当前页内容都在object_list
context['object_list']
'''
context = {
'paginator': paginator,
'page_obj': page,
'is_paginated': is_paginated,
'object_list': queryset
}
输出检索内容的相关国家
# models.py 不完善
class Country(models.Model):
name = models.CharField(max_length=128, verbose_name='国家', null=True)
slug = models.SlugField(unique=True, help_text='与该条数据的id值相同即可')
class Meta:
verbose_name = '国家'
verbose_name_plural = '国家列表'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('blog:country', kwargs={'slug': self.slug})
def get_article_list(self):
'''返回当前标签下所有发表的文章列表'''
return Article.objects.filter(country=self)
class Article(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='上传人员', on_delete=models.PROTECT)
title = models.CharField(max_length=150, verbose_name='文章标题')
country = models.ForeignKey(Country, verbose_name='国家', on_delete=models.PROTECT, null=True)
# views.py
# 重写搜索视图,可以增加一些额外的参数,且可以重新定义名称
class MySearchView(SearchView):
context_object_name = 'search_list'
paginate_by = getattr(settings, 'BASE_PAGE_BY', None)
paginate_orphans = getattr(settings, 'BASE_ORPHANS', 0)
queryset = SearchQuerySet().order_by('-views')
def get_context_data(self, *args, **kwargs):
context = super(MySearchView, self).get_context_data(*args, **kwargs)
# do something
# 所有结果
print(self.queryset)
# 当前页面结果
for i in context['object_list']:
print(i.object.country)
return context
# urls.py
path('search/', MySearchView.as_view(), name='search_view'), # 全文搜索