您的位置:首页 > 运维架构 > 网站架构

我的网站搭建 (第十三天) 自定义全文搜索

2018-09-04 21:40 513 查看
关于全文搜索的部分,主要是利用了haystack,whoosh和jieba这三个包,而且必须安装,否则以下内容无效。详细的说法已经在之前Django框架的学习内容中总结过了:Django 框架15: 全文搜索

这次继续学习全文搜索的内容主要是因为在之前的内容中,缺少了自定义全文搜索部分。因为在后来的开发中,我发现搜索页的结果只有在blog_text.txt中出现过的字段名。如果我想继续如博客列表那样显示出榜单排行就无法实现了,因为search.html模板页面不会经过自定义的views,所以就必须采用某种办法可以实现自定义某种context参数传递到search.html模板页面中

幸运的是,haystack的views提供了extra_context这种接口,通过继承SearchView类,就可以重写该方法

def extra_context(self):
"""
Allows the addition of more context variables as needed.

Must return a dictionary.
"""
return {}

1.首先,编写一个MySeachView类,让它继承SearchView类

from haystack.views import SearchView
from read_statistics.utils import get_random_recomment, get_new_recommend_post, get_all_read_posts
from django.contrib.contenttypes.fields import ContentType
from .models import Post
from django.core.paginator import *   # 导入分页功能
from blogproject.settings import *

class MySeachView(SearchView):
"""
作用:自定义的search视图
SearchView:继承SearchView类
"""
def extra_context(self):  # 重载extra_context来添加额外的context内容
"""
添加自定义的context参数,传递到search.html视图
:return: 自定义的context参数
"""
context = super(MySeachView, self).extra_context()

# 这里的EACH_RAGE_BLOG_NUMBER等于10,已经当成常量写进了seetings里
paginator = Paginator(self.results, EACH_RAGE_BLOG_NUMBER)

# 采用get方式获取用户访问的页码,如果获取不到,默认为第一页
page_num = self.request.GET.get('page', 1)

# 因为用户输入不一定是数字,所以需要用int(page_num),而django里的get_page会自动识别用户输入以及页码范围
# 注意这里的page_of_list是一个paginator对象
page_of_list = paginator.page(int(page_num))

# 获取当前页码
current_page_num = page_of_list.number

# page_range = [current_page_num - 2, current_page_num - 1,
# current_page_num, current_page_num + 1, current_page_num + 2]

# 获取当前页码前后各两页的页码范围
# 需要注意判断的是:如果当前页是第一页,那么前两页不能是0,也不能是-1,所以要使用内置max函数来与1比较最大值
# 同理:如果当前页已经是最后一页,那么就不能取到当前页+2的页码了,所以要使用内置min函数来与最大页码比较最小值
page_range = list(range(max(current_page_num - 2, 1), current_page_num)) + \
list(range(current_page_num, min(current_page_num + 2, paginator.num_pages) + 1))

# 加上省略页码标记
# paginator.num_pages表示一共有多少页码
if page_range[0] - 1 >= 2:
page_range.insert(0, '...')
if paginator.num_pages - page_range[-1] >= 2:
page_range.append('...')

# 加上首页尾页
# paginator.num_pages表示一共有多少页码
if page_range[0] != 1:
page_range.insert(0, 1)
if page_range[-1] != paginator.num_pages:
page_range.append(paginator.num_pages)

# 随机推荐的15篇博客
random_recommend = get_random_recomment()

# 最新推荐的15篇博客
post_content_type = ContentType.objects.get_for_model(Post)
new_recommend = get_new_recommend_post(post_content_type)

# 阅读量总榜博客榜单
all_hot_posts = get_all_read_posts()
context = {
'page_range': page_range,
'random_recommend': random_recommend,
'new_recommend': new_recommend,
'all_hot_posts': all_hot_posts,
}
return context

2.如上可以看到,我已经新加了一些参数放到了context里面,然后把该类添加到项目的url中

url(r'^search/', MySeachView(), name='haystack_search'),

3.最后修改search.html模板就可以完全实现自定义的搜索页的视图功能了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jieba Django Haystack Whoosh