首页 > 解决方案 > 需要帮助创建搜索视图以及如何在我创建的 DB 的 HTML 页面中应用 - Django

问题描述

我正在与 DJANGO 建立一个网站,人们在其中放置单词和联想如何记住单词。我构建了插入单词的部分。

我现在陷入了实现单词搜索和从数据库中提取信息的部分。

def Search_word(request):
if request.method == "POST":
    search = request.POST["search"]
    word = Words.objects.filter(English_word__contains = search)
    return render(request,"search_page.html",{word:word , search:search})
else:
    return render(request,"search_page.html",{})

    {% if search %}
<h1> You searched for {{search}}</h1>

{% for Words in search %}
    {{Words.English_word}}
    {{ Words.Hebrew_word }}
    {{ Words.How_To_Remember}}
{% endfor %}

{% else %}
  <h1> Hey! You Forgot To Search </h1>

{% endif %}

标签: htmldjango

解决方案


如果你只想在一个字段中搜索,Django 支持搜索,它比 contains 更好更准确

words = Words.objects.filter(English_word__search = search_term)

但如果你想拥有某种类似搜索引擎的功能,你可以将PostgreSQLDjango 的全文搜索功能一起使用

model.py添加这些命令

from django.contrib.postgres.search import SearchVector

在您的模型管理器中:

def full_search(self, search_term):
      return self.annotate( 
            search=SearchVector('English_word') + 
            SearchVector('blog__tagline')).filter(search=seach_term)

此方法将删除 <in/at/is/the/...> 其他英文单词,并且仅使用单词到向量算法进行搜索

如果您必须对搜索结果进行排名:

from django.contrib.postgres.search import SearchQuery, SearchRank,SearchVector

vector = SearchVector('english_word')
query = SearchQuery(search_term)
Word.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')

这将根据搜索词的可能性对结果进行注释。

顺便说一句,使用模型管理器并避免在视图中执行 ORM 是最佳实践。

关于搜索的 Django 文档: https ://docs.djangoproject.com/en/3.2/ref/contrib/postgres/search/


推荐阅读