当前位置: 首页 > article >正文

django博客项目实现站内搜索功能

Django博客站内搜索功能实现

1. 准备工作

确保Django项目已经创建好,并且有一个用于存储博客文章的模型(例如Post)。

2. 定义搜索表单

在应用目录下创建一个forms.py文件,定义一个搜索表单。

from django import forms

class SearchForm(forms.Form):
    query = forms.CharField(label='搜索', max_length=100)

3. 创建视图

views.py文件中,添加一个视图来处理搜索请求。

from django.shortcuts import render
from .models import Post
from .forms import SearchForm

def search(request):
    form = SearchForm(request.GET)
    if 'query' in request.GET and form.is_valid():
        query = form.cleaned_data['query']
        results = Post.objects.filter(title__icontains=query) | Post.objects.filter(content__icontains=query)
    else:
        results = Post.objects.none()

    context = {
        'form': form,
        'results': results,
    }
    return render(request, 'search.html', context)

4. 配置URL

在应用的urls.py文件中,添加一个URL规则来指向搜索视图。

from django.urls import path
from .views import search

urlpatterns = [
    path('search/', search, name='search'),
]

5. 创建搜索模板

在应用的模板目录下,创建一个search.html文件,用于显示搜索表单和结果。

<!-- search.html -->
{% extends 'base.html' %}

{% block content %}
  <h2>站内搜索</h2>
  <form method="get" action="{% url 'search' %}">
    {{ form.as_p }}
    <button type="submit">搜索</button>
  </form>

  {% if results %}
    <h3>搜索结果</h3>
    <ul>
      {% for post in results %}
        <li>
          <h4><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h4>
          <p>{{ post.content|truncatewords:30 }}</p>
        </li>
      {% endfor %}
    </ul>
  {% else %}
    <p>没有找到相关文章。</p>
  {% endif %}
{% endblock %}

6. 优化搜索

  • 索引:为了提高搜索效率,可以考虑为Post模型的titlecontent字段添加数据库索引。
  • 全文搜索:Django的Q对象支持复杂查询,但对于全文搜索,可能需要使用额外的库,如django-haystack或Django自带的SearchVector
  • 分页:如果搜索结果很多,考虑使用django.core.paginator来实现分页。

7. 测试

启动你的Django项目并访问/search/路径,你应该能够看到一个搜索表单,输入关键词后,页面会显示匹配的博客文章。


http://www.kler.cn/a/391832.html

相关文章:

  • 前端-同源与跨域
  • 论文阅读《BEVFormer v2》
  • Android OpenGL ES详解——立方体贴图
  • 事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)
  • 24/11/12 算法笔记<强化学习> Policy Gradient策略梯度
  • 【小程序】封装网络请求request模块
  • Could not initialize class sun.awt.X11FontManager
  • React Hooks在现代前端开发中的应用
  • vue3+ant design vue实现表单模糊查询
  • 移动硬盘需要格式化才能打开?详解原因与数据恢复方案
  • C++函数传递引用或指针
  • linux基础入门实战
  • 特朗普上任在即,加密监管走向何方?
  • Jenkins安装自定义插件
  • 350. 两个数组的交集 II
  • python3的基本数据类型:Dictionary(字典)的创建
  • Python如何从HTML提取img标签下的src属性
  • 太速科技-440-基于XCVU440的多核处理器多输入芯片验证板卡
  • uniapp使用uni-tooltip自定义多行
  • hive中数据的粒度级别有哪些?
  • 视频智能分析平台LiteAIServer算法定制未戴安全帽检测技术:智能安防领域的新篇章
  • 2024最新版JavaScript逆向爬虫教程-------基础篇之面向对象
  • AI养宠:如何重塑宠物照护的未来
  • vue+vite前端项目ci过程中遇到的问题
  • 为什么你总是被割韭菜?揭秘币圈五大操控手段,教你如何避开“割韭菜”陷阱
  • 算力100问☞第1问:算力为什么重要?