Django開発~ショッピングカート構築編6~検索機能の導入

django

Django開発~ショッピングカート構築編5~ページネーションの導入の続きです。

本日は、検索機能の実装を行います。

学習履歴

searchアプリケーションの作成

まずは、次のコマンドで”search”アプリケーションを作成しましょう。

続いて、settings.pyに次の設定を行います

①shopアプリケーションを認識させる
②テンプレートファイル格納場所を指定

Todoリストの作成

テスト駆動で開発を行っている為、最初にテストコードを書く必要があります。

その為には、検索アプリの仕様を決めなければなりません。

検索アプリの仕様は、シンプルです。

仕様
・商品一覧から検索に合致したプロダクトを別ページに表示する
・フリーテキスト入力の検索ボックスを用意する(既に用意済み)
・プロダクトの名前と概要から検索をかける

この検索アプリを実装するために必要なことを箇条書きにします。

Todoリスト
①検索結果ページを用意する
②検索結果ページへのアクセスを可能にする
③複数のデータの中から検索をかけ、任意のデータのみ抽出できることを確認する
④navbarに設定されている検索ボックスを修正する

ひとまず、4つ思いつきました。

Todoリストは後から追加してもかまいません。

検索結果へのアクセス

まずは、searchフォルダ配下にtestsフォルダを作成し、その中にテストファイルを作成しましょう。

続いて、検索結果画面にアクセスしたときのテストを実装します。

正常にアクセスできた場合は、HTTPリクエストコードが「200」を返すので、そのコードが帰ってくるかテストしています。

テストを実行しましょう。

「NoReverseMatch」の表示とともにエラーが出力されました。

これは、指定したURLに該当するURLがないことを示しています。

「reverse(‘search:search_result’)」は、urls.pyに定義する「namespace」と「pathのname」からURLを取得します。

searchアプリケーション配下に、urls.pyを作成してください。

このファイルにsearchアプリのviewへのパスを記述します。

この「app_name」と「search_result」をreverse関数に「’search:search_result’」という形式で指定するとviews.pyのsearch_result関数へのパスが取得できます。

テストを実行しましょう。

同じエラーが出力されました。

実は、Djangoでは、urls.pyは「2種類」あります。

プロジェクト(app)配下のurls.py」と「アプリケーション(search)配下のurls.py」です。

ユーザーからのリクエストを受け取ると最初にプロジェクト配下のurls.pyにリクエストが渡り、続いて、アプリケーション配下のurls.pyにリクエストが渡されます。

プロジェクト配下のurls.pyを修正しましょう。

テストを実行します。

エラー内容が変わりました。

このエラーは、「views.pyにsearch_result関数が設定されていない」ため、発生しました。

search_result関数を実装しましょう。

テストを実行しましょう。

search.htmlファイルが存在しないのでエラーがでました。
同様のエラーが出ない場合は、一旦、Dockerコンテナを立ち上げなおしてみてください

search.htmlファイルを作成しましょう。

テストを実行します。

テストがパスしましたね。

Todoリストから②を消しましょう。※①は完了していないのでそのままです

Todoリスト
①検索結果ページを用意する
②検索結果ページへのアクセスを可能にする
③複数のデータの中から検索をかけ、任意のデータのみ抽出できることを確認する
④navbarに設定されている検索ボックスを修正する

検索ロジックの作成

続いては、検索ロジックを作成しましょう。

テストコードを書きます。

カテゴリとプロダクトのデータ作成用の関数を追加し、setUp関数でデータ作成しています。

setUp関数は、テストコードが実行される前に必ず実行される特別な関数です。

テストを実行してみましょう。

key エラーになりましたね。

views.pyのsearch_resultの戻り値にproductsがないことが原因です。

views.pyを実装していきましょう。

テストを実行します。

「AssertionError: assert ‘rabbit’ not in [‘cat’, ‘dog’, ‘rabbit’]」と出ました。

次は、検索処理を追加します。

Djangoで検索する方法はいくつかありますが、今回は「Qオブジェクト」を使用しました。

Qオブジェクトは、データベースの検索用クエリを作成してくれます。

上記の例では、Productモデルのname属性に対して「ダブルスコア(__)」と「contains」を結合しました。

このようにすると、検索条件(q)に含まれる名前を検索できます。

その他の使い方については、こちらを確認してください。

テストを実行しましょう。

テストがパスしましたね。

これで、Todoリストの③が終了しました。

Todoリスト
①検索結果ページを用意する
②検索結果ページへのアクセスを可能にする
③複数のデータの中から検索をかけ、任意のデータのみ抽出できることを確認する
④navbarに設定されている検索ボックスを修正する

HTMLの変更

まず、navbar検索ボックスの変更をしましょう。検索ボタンを押下したときに、qクエリがURLの末尾に追加されるようにします。

続いて、search.htmlを作成します。

このファイルに検索フォームを実装します。

custom.cssに個別のスタイルを追加します。

これで、残りのTodoリストは削除できます。

Todoリスト
①検索結果ページを用意する
②検索結果ページへのアクセスを可能にする
③複数のデータの中から検索をかけ、任意のデータのみ抽出できることを確認する
④navbarに設定されている検索ボックスを修正する

動作確認

「localhost:8000」にアクセスして、検索機能の動作確認をしましょう。

検索バーにorangeを入力後、検索ボタンを押下
orangeだけ表示される

私の環境だと問題なく動作しました^^

ちなみに検索後のURLは、以下のようになっています。

参考書籍

次回

次回は、ショッピングカートを実装します!

コメントを残す