Djangoプロジェクトにキーワード検索機能を追加する方法
※データベース上にキーワードを設定し画面上は表示せずに、ユーザが入力するであろう検索ワードを設定しておく方法。
Djangoプロジェクトにキーワード検索機能を追加する方法
Djangoで音楽アルバム管理サイトを構築しているとします。アルバムモデルにはさまざまなフィールドがありますが、今回はキーワードフィールドを追加して、ユーザーがより詳細な検索ができるようにします。
ステップ1: モデルの更新
まず、Album モデルに keywords フィールドを追加します。
models.py
from django.db import models
class Album(models.Model):
# 他のフィールドは省略
keywords = models.TextField(blank=True)
def __str__(self):
return self.title
ステップ2: マイグレーションの作成と適用
新しいフィールドを追加した後、以下のコマンドを実行してマイグレーションを作成し、適用します。
python manage.py makemigrations
python manage.py migrate
ステップ3: 管理サイトの更新
今回は credits フィールドの追加は必要ありませんので、keywords フィールドのみ管理サイトに表示されるようにします。
admin.py
from django.contrib import admin
from .models import Album
@admin.register(Album)
class AlbumAdmin(admin.ModelAdmin):
list_display = ['id', 'title', 'artist', 'format', 'label', 'catalog_number', 'release_date', 'keywords']
ステップ4: 検索機能の強化
検索機能に keywords フィールドを含めるため、views.py の該当するビュー関数を更新します。
views.py
from django.db.models import Q
from .models import Album
def album_list(request):
search_term = request.GET.get('search', '')
albums = Album.objects.none()
if search_term:
albums = Album.objects.filter(
Q(title__icontains=search_term) |
Q(artist__artist__icontains=search_term) |
Q(label__label__icontains=search_term) |
Q(format__format__icontains=search_term) |
Q(notes__icontains=search_term) |
Q(keywords__icontains=search_term) # keywordsを検索に追加
)
return render(request, 'album_list.html', {'albums': albums})
ステップ5: テンプレートの検証
album_list.html テンプレートで、ユーザーが入力した検索語がどのように表示されるかを確認します。また、検索結果が期待通りに機能するかをテストします。