第一次翻官方文檔,确實比看别人寫的部落格管用多了,看部落格說重載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'), # 全文搜尋