第7章 データベースのCRUD
CRUDとは、Create(作成)、Read(読み込み)、Update(更新)、Delete(削除)のことです。既に商品データベースで読み込み(商品一覧)と作成(商品追加)は作成していますが、残りを作成します。
1 削除確認画面へのリンク
商品の削除画面を作ります。まず、商品一覧(slist.html)の各商品の削除リンクを作り、そこをクリックすると、削除確認画面に遷移します。そこで削除ボタンを押すと、データが削除され、商品一覧に戻るという流れです。
商品一覧→削除確認→削除→商品一覧
まず、商品一覧から削除確認画面へのリンクを作成します。slist.html を修正し、削除確認画面にリンクを貼ります。削除確認画面は /del/商品ID というURLにします。
<tr>
<td>{{r.sid}}</td>
<td>{{r.sname}}</td>
<td>{{r.tanka}}</td>
<td><a href="/del/{{r.sid}}">削除</a></td>
</tr>
/del/{{r.sid}} とすることで、商品IDが1なら/del/1、2なら/del/2 にリンクを貼ることができます。 これにより、「削除」をクリックするとその商品の削除確認画面が表示されます。
2 削除確認画面
次に削除確認画面を作ります。 hanbai.py で /del/商品ID というURLに対し、del_get() 関数に記述します。テンプレートは del.html とします。
@app.get('/del/<sid>')
def del_get(sid):
row = Shouhin.query.get_or_404(sid)
return render_template('hanbai/del.html', shouhin=row)
sidを受け取って、それを元に商品を検索します。検索はdb.get_or_404で行います。これは指定した商品IDが存在しなかった場合、404画面(File Not Found)を表示します。商品の検索ができたら、del.htmlにshouhinという名前で渡します。
del.html では、商品ID、商品名、単価を表示します。そして、削除ボタンを押すと、URL /del/商品ID にPOSTで遷移します。
<p>削除しますか?</p>
<form action="/del/{{shouhin.sid}}" method="post" >
<p>商品ID:{{shouhin.sid}}</p>
<p>商品名:{{shouhin.sname}}</p>
<p>単価:{{shouhin.tanka}}</p>
<input type="submit" value="削除">
</form>
3 削除処理
hanbai.pyに関数del_postを作成します。sidを受け取り、先ほどと同様にsidで検索を行います。そして、db.session.delete(row)で削除し、commitした後、トップページにリダイレクトします。
@app.post('/del/<sid>')
def del_post(sid):
row = Shouhin.query.get_or_404(sid)
db.session.delete(row)
db.session.commit()
return redirect('/')
問題:売上の削除
売上一覧ページ ulist.html に売上削除確認ページへのリンクを作成します。URLは /udel/売上ID とします。 hanbai.py に udel_get関数を作成し、確認ページ udel.html を表示します(udel.html はdel.htmlをコピーし作成します)。 udel.html では、売上ID、商品ID、個数、日付を表示し、削除ボタンを押すと、/udel/売上ID にPOSTで遷移し、udel_post関数で削除します。
4 商品の変更
商品の変更画面を作ります。まず、商品一覧(slist.html)の各商品の変更リンクを作り、そこをクリックすると、各商品の変更入力画面に遷移します。そこで変更箇所を入力し、変更ボタンを押すと、商品が変更され、商品一覧に戻ります。
商品一覧→変更入力→変更→商品一覧
変更入力画面は /update/商品ID というURLにし、update_get() 関数に記述します。テンプレートは update.html とします。 変更は /update/商品ID のPOSTで行うことにし、update_post() 関数に記述します。
まず、slist.html を修正し、変更入力画面にリンクを貼ります。
<tr>
<td>{{r.sid}}</td>
<td>{{r.sname}}</td>
<td>{{r.tanka}}</td>
<td><a href="/del/{{r.sid}}">削除</a></td>
<td><a href="/update/{{r.sid}}">変更</a></td>
</tr>
次に変更入力画面を作ります。まず、web.py にupdate_get関数を作ります。sidを受け取って、それを元に商品を検索し、update.htmlに渡します。
@app.get('/update/<sid>')
def update_get(sid):
row = Shouhin.query.get_or_404(sid)
return render_template('hanbai/update.html', shouhin=row)
update.html では、商品名、単価をテキストボックスで表示しユーザが変更できるようにします。このとき、value属性で現在の値を表示します。 フォームの送信先URLは /update/商品ID とします。
<form action="/update/{{shouhin.sid}}" method="post" >
商品名:<input type="text" name="sname" value="{{shouhin.sname}}"><br>
単価 :<input type="text" name="tanka" value="{{shouhin.tanka}}"><br>
<input type="submit" value="変更">
</form>
hanbai.pyに関数update_postを作成します。sidで商品を検索した後、フォームから送られた sname、tankaでオブジェクトを更新し、commmitします。最後にトップページにリダイレクトします。
@app.post('/update/<sid>')
def update_post(sid):
row = Shouhin.query.get_or_404(sid)
row.sname = request.form['sname']
row.tanka = request.form['tanka']
db.session.commit()
return redirect('/')