2019/12/3 22:44:32
簡介
- 一個blog有搜索功能實在是再正常不過了,今天就來看看如何實現一個簡單的搜索功能。
- 搜索就是輸入關鍵詞搜索與標題相關的文章,先構思搜索功能的一般流程:前端一個輸入欄,一個搜索按鈕,輸入關鍵詞,提交;後端獲取關鍵詞,再數據庫中搜索標題中含有關鍵詞的標題,然後將搜索到的結果展示到前端。大致就是這樣的流程。
實現如下:
# 1. 搜索函數的實現:
def search(request):
q = request.GET.get('q') # 獲取關搜索鍵詞
contexts = Article.objects.all().order_by('-pub_date')[:5] # 獲取最近五篇文章
search_list = Article.objects.filter(title__icontains=q) # 根據標題所含關鍵詞搜索
error_msg = 'No result'
return render(request, 'blog/search.html', {'search_list': search_list,
'error_msg': error_msg,
'contexts': contexts})
'q’是前端input標籤name屬性的名字,稍後再說。代碼第二行就是獲取前端輸入框裏關鍵字。第三、四行是在數據庫中查詢,第三行查詢所有文件,第四行查詢標題中包含關鍵詞的內容。有的文章中有判斷q是否爲空,其實完全沒有必要,在前端html代碼中會說明。
# 2. 數據模型的實現:
class Article(models.Model):
title = models.CharField(max_length=200)
category = models.CharField(max_length=100, default='') # 文章分類
body = MDTextField()
pub_date = models.DateTimeField('datepublished',default=timezone.now)
def __str__(self):
return self.title
模型中創建的幾個字段,標題,分類,主體內容,發佈時間。
# 3. 前端html實現:
<form method="get" action="{% url 'blog:search' %}">
{% csrf_token %}
<input class="txt" type="search" name="q" placeholder="Search" required>
<button type="submit" value="Search">Search</button>
</form>
注意到input標籤中name的值q與搜索方法中的q相同,還有一個required,這個值說明輸入該不能爲空,有個這個值,後端的搜索方法中就不需要判斷q是否爲空。action設置url。
# 4. url的實現:
path('search/', views.search, name='search'),
# 5. 最後是獲取的文章展示:
{% if search_list %}
{% for search in search_list %}
{{ search }}
{% endfor %}
{% else %}
{{ error_msg }}
{% endif %}
搜索文章展示內容還需要一些css優化。