前回ではSQLite3に商品情報を新規登録する機能を作成しましたが、今回は商品情報を更新する機能を作成していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
instance └── create_db.py └── itemdb.sqlite3 web └── itemdb.py └── __init__.py └── templates | └── base.html | └── newitem.html | └── updateitem.html (1)・・・ 新規 | └── index.html (2)・・・ 更新 └── items.py (3)・・・ 更新 └── static └── style.css |
(1)updateitem.html
商品情報を更新するページを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{% extends 'base.html' %} {% block title %}商品詳細{% endblock %} {% block content %} <h2>商品詳細</h2> <form class="itemform" method="post"> <table> <tr> <td><label for="item_name">商品名:</label></td> <td><input name="item_name" id="item_name" value={{data['item_name']}}></td> </tr> <tr> <td><label for="price">価格:</label></td> <td><input name="price" id="price" value={{data['price']}}></td> </tr> <tr> <td><input type="submit" value="更新"></td> </tr> </table> </form> {% endblock %} |
・7~21行目:商品情報の更新機能を追加(要求形式は「POST」、パラメータ名は「itemform」)
・11,15行目:items.pyから取得した商品名、価格を設定
(2)index.html
更新ページへのリンクを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(省略) <table> <tr class='keyname'> <th>商品名</th> <th>価格</th> </tr> {% for item in items %} <tr> <td><a href="{{url_for('items.update', item_name=item['item_name'])}}">{{item['item_name']}}</a></td> <td>{{item['price']}}</td> {% endfor %} </table> (省略) |
・10行目:<a href>...:更新ページへのリンクに変更
(3)items.py
商品を更新するための処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
(省略) @bp.route('/items/<item_name>', methods=('GET', 'POST')) def update(item_name): if request.method == 'POST': item_name_new = request.form['item_name'] price = request.form['price'] db = get_db() db.execute("UPDATE items SET item_name=?, price=? WHERE item_name=?", (item_name_new, price, item_name)) db.commit() return redirect(url_for('items.index')) else: db=get_db() searchdata = db.execute( "SELECT * FROM items WHERE item_name like '%"+item_name+"%'").fetchone() return render_template('updateitem.html', data=searchdata) (省略) |
・5~11行目:POSTの場合 ⇒ 商品情報の更新処理
・12~17行目:POST以外(GET)の場合 ⇒ 商品情報を取得して更新ページへ遷移(情報を1件取得するため、fetchoneで取得)
実行結果は以下になります。
・TOP画面(「商品名」に更新ページへのリンクが追加)
・更新画面(商品情報を変更) ⇒ ”キャベツ”,”198″ から “キャベツ(千切り)”,”100″に変更
・更新後(商品情報画面へ戻る) ⇒ ”キャベツ(千切り)”,”100″に更新
以上です。