Djangoで作成した掲示板に検索機能を追加します。また検索範囲を全体、投稿内容のみ、タイトルのみというように選択できるようにします。
やることは以下のふたつです。
テンプレートに検索用のフォームを追加する
bbsディレクトリ内のviews.pyを編集する
作成した掲示板はこんな感じになります。 ⇒ 動作確認はこちらから
テンプレートに検索用のフォームを追加する
{プロジェクト名}/bbs\templates\bbsディレクトリ内のarticle_list.htmlを以下のように変更して検索用のフォームを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
{% extends 'layout.html' %} {% load markdown_extras %} {% block content %} <h1 class="mt-3 mb-4">投稿一覧</h1> <!-- 追加 ここから --> <form action="" method="get" class="mb-5"> <div class = "form-row"> <div class = "col-5"> <input name="query" value="{{ request.GET.query }}" type="text" class ="form-control"> <div class = "mt-2"> <button type="submit" class='submit btn btn-outline-primary'>検索する</button> <a href="./" class='submit btn btn-outline-primary ml-2'>クリア</a> <input type="checkbox" name="title" value="1" class = "ml-5">タイトル <input type="checkbox" name="article" value="1" class = "ml-2">投稿内容 </div> </div> </div> </form> <!-- 追加 ここまで --> <table class='table table-striped table-hover'> <tr> <th>投稿者</th> <th>内容</th> </tr> {% for article in object_list %} <tr> <td> <a href='{% url "bbs:detail" article.pk %}'>{{ article.title }} {{ article.author }}</a><br> 作成日時:{{ article.created_at|date:"Y-m-j H:i" }}<br> 更新日時:{{ article.updated_at|date:"Y-m-j H:i" }} </td> <td>{{ article.content|markdown|safe }}</td> </tr> {% endfor %} </table> {% if user.is_authenticated %} <p> <a href='{% url "bbs:create" %}' class='btn btn-outline-primary'>新規投稿</a> </p> {% endif %} {% endblock %} |
bbsディレクトリ内のviews.pyを編集する
bbsディレクトリ内のviews.pyを編集します。上部にfrom django.db.models import Qの一行を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
from django.db.models import Q # 追加 class IndexView(generic.ListView): # model = Article def get_queryset(self): q_word = self.request.GET.get('query') # チェックボックスにチェックが入っている項目だけを検索対象とする selected_title = self.request.GET.get('title') selected_article = self.request.GET.get('article') if q_word: if selected_title and selected_article: object_list = Article.objects.filter( Q(title__icontains=q_word) | Q(content__icontains=q_word)) elif selected_title: object_list = Article.objects.filter(Q(title__icontains=q_word)) else: # 投稿内容のみ、または両方ともチェックされていない場合は投稿内容のみを検索する object_list = Article.objects.filter(Q(content__icontains=q_word)) else: object_list = Article.objects.all() return object_list |