previous arrowprevious arrow
next arrownext arrow
Shadow
Slider

Django独学 フォームを使ってDBを更新する

Djangoのユーザ管理アプリ作成の目次ページはこちらです。

 

今回は、フォーム機能を使ってDBへ新規登録をさせます。

UdemyのDjangoの基礎をマスターして、3つのアプリを作ろう!を参考に勉強していています。

また、フォームを扱っていくのでHTMLの基本的な知識がある方でないとも難しいかもしれません。

更新処理の流れ

登録の時と同じで、以下の流れです。

①入力フォームをリクエストから呼び出す

②入力フォームをブラウザに表させる

③フォームに入力したデータをサーバに渡して更新

④更新した結果をブラウザに表示

この順番で処理を作成していきます。

Django独学 フォームを使ってDBに新規登録をする Djangoのユーザ管理アプリ作成の目次ページはこちらです。 今回は、フォーム機能を使ってDBへ新規登録をさせます...

①入力フォームをリクエストから呼び出す(urls.py)

まず最初に「~users/edit/id」と言うURLをユーザー更新のURLにします。

そのために、URLへアクセスされたときの動作をアプリのurls.pyに記入します。

15行目に追記をしました。

※この次にviews.pyの説明を記載します。

一旦viewsのことは置いておいて、やっていることだけ理解してみて下さい。

path(‘<int:id>/edit’, views.showEditUserForm, name=’showEditUserForm’),の解説です。

‘<int:id>/edit’:URLがusers/id/edit/場合の指定した処理を呼ぶという意味

views.showEditUserForm:views.pyのshowEditUserFormの処理を呼ぶという意味です。

name=’showEditUserForm’:リンク先に指定するときの名前で後で使います。

②編集フォームをブラウザに表させる

新規登録フォームは入力欄は空白でしたが、

編集フォームではユーザの情報をフォームに表示させます。

そのため、

以下の流れになります。

①更新対象のユーザ情報を取得

②htmlへフォームを渡す

③ブラウザにフォームを表示させる

※フォームは前回新規登録の時に作成したものを使います。

ブラウザに編集フォームを表示させる(views.py)

①~③はすべてviews.pyで作ります。

以下を追記しています。

5行目で更新対象のユーザ情報を取得しています。

7行目ではフォームをインスタンス化して、

16行目でHTML側に情報を渡しています。

ユーザ情報は更新した後に、対象のユーザページを表示するために渡しています。

フォームを表示するHTML作成(edit.html)

edit.htmlはまだ作っていないので、以下に作成します。

C:\django\myproject\myapp\templates\myapp

htmlの中身は以下です。

ほとんどcreate.htmlのコピペです。

ボタンクリック時のactionで呼び出す関数を変えるだけです。

※ユーザを更新する処理はこの次に書きます。

今はエラー回避のためにユーザ一覧へ遷移するようにしています。

表示させてみるとこんな形で、idをもとにユーザ情報を表示できています。

③フォームに入力したデータを登録後、結果表示

現状は更新ボタンクリック時にユーザ一覧を表示していますが、ユーザ一情報を更新する処理を呼ぶようにします。

まずは更新ボタンをクリックした後、DBに登録する処理を作っていきます。

更新処理を呼び出す(urls.py)

まずはurls.pyにユーザを更新する処理を呼ぶように記載します。

この処理をアプリのurls.pyに追記します。

編集フォームの時と同じで、

<int:id>/updateのURLであれば、viewsのupdateUserを呼び出すという意味です。

updateUserの処理は次で作成します。

ユーザ情報DBに更新する処理を作成(views.py)

処理の流れとしては、以下になります。

①フォームデータをDBに更新

②ユーザ詳細ページを表示

以下の処理を追加して①②両方ともviews.pyに記載しています。

9行目について

userFormに変数にPOSTで受取った情報と、対象ユーザーの情報を入れています。

11行目のuserForm.save()

登録の時と同じsave()を使っています。

なぜ全く同じメソッドを呼んで、登録と更新が勝手に分かれるのか調べてみたところ、djangoの仕様で以下になっているそうです。

既にプライマリキーがあるデータの条件を指定した場合は、INSERTでなく
UPDATE SQL 文が実行されます。

Django SQL データベース INSERT UPDATE 追加更新方法 save() create() add() update()

userFormの引数になっているuserInfoはPKが入っているので、自動的に更新になります。

デバッグ実行で止めて、userForm → instanceとたどっていくと、確かにプライマリキー(pk)がありました。

14行目~20行目で、更新した後のユーザ情報を取得して、詳細ページに表示させています。

更新ボタンクリック後にupdateUserを呼ぶ(edit.html)

これでユーザ更新する処理が作成できました。

最後に、edit.htmlの更新ボタンクリックした後の処理を書き換えます。

7行目の{% url “showUsers” %}を

{% url “updateUser” userinfo.id %}に書き換えました。

これで、ユーザー詳細ページに遷移できます。

編集フォームを呼び出すshowEditUserFormで、userinfoをHTMLへ渡していたのは、

ユーザ情報のidを遷移先のURLにするためです。

localhost:8000/users/1/editにアクセスして、

事項紹介のサッカーを野球にして更新ボタンを押してみると。

更新されて、「サッカー」が「野球」に変わりました!

ユーザ編集ボタンをユーザ一覧に作成(users.html)

最後に、このままだとユーザ編集画面に行くことができません。

なのでユーザ一覧画面に、編集ボタンを作っておきます。

20行目でユーザ編集ボタンを追加しました。

引数にはユーザ情報のidをセットしています。

これで編集ボタンが追加できました。

(おまけ)ModelFormに複数行入力のテキストエリアを表示(forms.py)

よく見てみると、自己紹介は500文字まで入力可能なのに、改行をすることができませんでした…

テキストボックスではなく、テキストエリアに変えてあげればOKです。

forms.pyを以下のように修正しました。

17行目の記述方法でテキストエリアに変えることができます。

 

今回はここまでです!

ABOUT ME
LooseCarrot
LooseCarrot
ブログ運営をしているLooseCarrotです。 興味のあることにトライして発信していきます! プロフィール
関連している記事

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です