コンテンツにスキップ

第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('/')