Django 検索機能の基本[ListView]

2019年12月18日

Djangoにおいてシンプルな検索機能を実装し、その基本的な流れを説明します。

 

まずは単純にクラスベースビューであるListViewによってモデルのデータを表示させ、そこに検索機能を追加します。ListView自体に関しては本記事では説明しませんので下記ページをご覧下さい。

 

ListViewでモデルの一覧表示

 

 

本記事では下記のBookモデルを使用します。最終的にtitle(タイトル)とautor(著者)に対して検索するシステムを作成します。またmyappというアプリケーションにおいて作成していきます。

 

myapp/models.py

 

まずはBookモデル一覧ページを作成します。テンプレート名は book_list.html と命名していることに注意して下さい。

 

myapp/views.py

 

myapp/urls.py

 

myapp/templates/myapp/book_list.html

 

適当なデータを登録して表示

 

 

検索機能を追加する


 

次に検索機能を追加します。

 

myapp/templates/myapp/book_list.html

11〜14行目

本記事ではGETメソッドによって検索ワードをビュー側(views.py)へと送ります。12行目の{{ request.GET.query }}はURLのパラメータの値を取得しています。フォームに検索ワードを入力し検索ボタンを押下した際に、フォームに値が表示されたままの状態を実現しています。例えばURLが「myapp/?query=hoge」の場合、hogeがフォームに表示されます。

 

myapp/views.py

9行目〜

get_queryset()はListViewを利用する場合のメソッドで、モデルに登録されたデータすなわちオブジェクトのリストを返します。検索機能はこれらオブジェクトに対してfilterによって絞り込みをかけることによって実装していきます。

 

10行目

request.GET.get()によってGETメソッドによってリクエストされた値を取得しています。引数には、テンプレート側のフォームのname属性を指定します。仮にフォームに「由紀夫」と入力して検索ボタンを押下すると、URLは下記のようになり、「由紀夫」というワードが q_word に格納されます。

 

12〜17行目

q_wordに格納された値によって、filter()で絞り込みをおこなっています。Qオブジェクトは複雑なクエリを記述する場合に利用し、「 | 」はOR を表します。ここではtitleとauthorに対して「__icontains」を付与することによって、q_wordの値を含む部分一致の検索を実現しています。他にも完全一致である「__exact」等があります(フィールドルックアップを参照)

 

由紀夫で検索した画面

 

 

参照ページ


 

django ドキュメント

クエリを作成する

 

マネージャー

 

 

 

LINEで送る
Pocket

定番本
定期本
 
Copyright © 2020 思考の葉 All Rights Reserved.  プライバシーポリシー