天天看點

Django 全文檢索haystack實作重載context内容

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