使用Django中的全文搜索(Full Text Search)扩展你的应用程序
在Django中,我们可以使用第三方库来实现全文搜索功能。其中比较流行的有两个库:Haystack和Django Full Text Search。
下面演示如何使用Django Full Text Search来实现全文搜索功能:
- 安装Django Full Text Search:
pip install django-fulltext-search
- 在settings.py中添加以下配置:
INSTALLED_APPS = [
...
'django_fulltext_search',
]
FULLTEXT_SEARCH_RESULT_LIMIT = 20 # 搜索结果最大数量,可选配置
- 在models.py中定义需要搜索的模型类,如:
from django.db import models from django_fulltext_search import FullTextSearchMixin class BlogPost(FullTextSearchMixin, models.Model): title = models.CharField(max_length=100) content = models.TextField() def __str__(self): return self.title
其中,需要使用FullTextSearchMixin来添加全文搜索功能。
- 执行数据库迁移操作:
python manage.py makemigrations python manage.py migrate
- 在views.py中添加搜索视图:
from django.views.generic import ListView from django_fulltext_search.controller import SearchListMixin from .models import BlogPost class SearchResultsView(SearchListMixin, ListView): model = BlogPost template_name = 'search_results.html' paginate_by = 10 search_fields = ['title', 'content']
其中,我们使用SearchListMixin来添加搜索功能。需要指定model,search_fields(需要搜索的字段),template_name和paginate_by等参数。
- 在urls.py中添加搜索路由:
from django.urls import path from .views import SearchResultsView urlpatterns = [ path('search/', SearchResultsView.as_view(), name='search_results'), ]
- 在templates中添加搜索页面,如search_results.html:
{% extends 'base.html' %}
{% block content %}
{% if query %}
<h2>Search results for "{{ query }}"</h2>
{% if object_list %}
{% for post in object_list %}
<div class="post">
<h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
<p>{{ post.content|truncatechars:200 }}</p>
</div>
{% endfor %}
{% if page_obj.has_previous %}
<a href="?q={{ query }}&page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">{{ page_obj.number }}</span>
<span class="total-pages">{{ page_obj.paginator.num_pages }}</span>
{% if page_obj.has_next %}
<a href="?q={{ query }}&page={{ page_obj.next_page_number }}">next</a>
{% endif %}
{% else %}
<p>No results found.</p>
{% endif %}
{% endif %}
{% endblock %}
其中,我们展示了搜索结果,并使用了分页功能。
- 在模板中添加搜索表单,如base.html:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blog</title>
<link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="{% url 'search_results' %}">Search</a></li>
</ul>
</nav>
<div class="container">
<form method="GET" action="{% url 'search_results' %}">
<input type="text" name="q" placeholder="Search...">
<button type="submit">Go</button>
</form>
{% block content %}
{% endblock %}
</div>
</body>
</html>
在表单中添加了搜索框和提交按钮。
- 启动Django服务器,测试搜索功能。
以上就是使用Django Full Text Search实现全文搜索功能的全部过程。如果使用字符串作为范例,可以搜索“pidancode.com”或“皮蛋编程”来测试搜索效果。
相关文章