前回ではSQLite3に登録された商品情報を読み込んでWebページに表示しましたが、今回はその商品情報を検索する機能を作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
instance └── create_db.py └── itemdb.sqlite3 web └── itemdb.py └── __init__.py └── templates | └── base.html | └── index.html (1)・・・ 更新 └── items.py (2)・・・ 更新 └── static └── style.css |
(1)index.html
商品名を検索するための入力フォームを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{% extends 'base.html' %} {% block title %}Search{% endblock %} {% block content %} <div class="message">{{message}}</div> <form method="post"> <label for="item_name">商品名</label> <input name="item_name"> <input type="submit" value="検索"> </form> <table> <tr class='keyname'> <th>商品名</th> <th>価格</th> </tr> {% for item in items %} <tr> <td>{{item['item_name']}}</td> <td>{{item['price']}}</td> {% endfor %} </table> {% endblock %} |
・6~11行目:検索機能を追加(要求形式は「POST」、パラメータ名は「item_name」)
(2)items.py
SQLite3に登録されている商品情報を検索して、検索結果をindex.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 |
from flask import ( Blueprint, render_template, request ) from web.itemdb import get_db bp = Blueprint('items', __name__) @bp.route('/', methods=('GET', 'POST')) def index(): db=get_db() alldata = db.execute('SELECT * FROM items').fetchall() if request.method == 'POST': item_name = request.form['item_name'] message = '商品名「'+item_name+'」を含む商品情報は' searchdata = db.execute( "SELECT * FROM items WHERE item_name like '%"+item_name+"%'").fetchall() if len(searchdata)>0: message += '以下の通りです。' else: searchdata = alldata message += '見つかりませんでした。' return render_template('index.html', message=message, items=searchdata) else: message='お探しの商品を検索してください。' return render_template('index.html', message=message, items=alldata) |
・2行目:requestのインポートを追加
・8行目:methodsを追加(最初に開いたとき[GET]と、値を送信したとき[POST])
・14~25行目:POSTの場合での処理
・26~28行目:POST以外(GET)の場合での処理
実行結果は以下になります。
・検索前
・検索後(情報あり:検索にヒットした商品情報のみ表示)
・検索後(情報なし:商品情報をすべて表示)